redis

发布时间 2023-03-23 09:57:45作者: 是心有林夕啊

Redis

直接进入主题吧

配置 redis 运行环境

Linux - CentOS 7 64 位,安装 Redis

下载地址

  1. 将下载后的压缩包上传至 Linux 系统中。
  2. 解压安装包到 usr/local 目录:tar -zxvf filename.tar.gz -C /usr/local
  3. 进入到解压后的 redis 目录:cd /usr/local/redis-xxx
  4. 编译 Redis 文件,Redis 是 c 语言写的,会用到 gcc 编译器,执行 make
    • 会出现两个错误
      • 错误一:gcc 命令找不到,gcc: Command not found
      • 解决错误一:yum -y install gcc
      • 错误二:error: jemalloc/jemalloc.h: No such file or directory
      • 解决错误二:make MALLOC=libc
  5. 执行 make distclean 清理上次 make 后产生的文件
  6. 执行 make 命令进行编译,成功的标志:make[1]:Leaving directory '/usr/local/redis-3.2.9/src'
  7. 注意:在 make 执行之后再执行 make install,该操作则将 src 下的许多可执行文件复制到 /usr/local/bin 目录下,这样做可以在任意目录执行 redis 的软件的命令(例如启动,停止,客户端连接服务器等)

Linux - CentOS 7 64 位,启动 Redis

  1. 进入 redissrc 目录。
  2. 启动 redis,查看是否启动成功 ps -ef | grep redis
    • 前台启动:./redis-server
      • src 目录下执行 redis-server
      • 以前台的方式启动,不能退出当前窗口,退出窗口,应用终止。
    • 后台启动:./redis-server &

Linux - CentOS 7 64 位,关闭 Redis

  1. 方式一:使用 redis 客户端关闭, 向服务器发出关闭命令
    • src 目录下,执行 ./redis-cli shutdown
    • 推荐使用这种方式,redis 先完成数据操作,然后再关闭。
  2. 方式二:kill pid 或者 kill -9 pid
    • 这种不会考虑当前应用是否有数据正在执行操作,直接就关闭应用。
    • 先使用 ps -ef | grep redis 查出进程号, 在使用 kill pid

Linux - CentOS 7 64 位,连接 Redis

redis 命令行客户端

  1. 方式一:直接连接 redis (默认ip127.0.0.1,端口6379):./redis-cli
    • src 目录, 执行 ./redis-cli
  2. 方式二:指定 IP 和端口连接 redis:./redis-cli -h 127.0.0.1 -p 6379
    • -h redis 主机 IP(可以指定任意的 redis 服务器)
    • -p 端口号(不同的端口表示不同的 redis 应用)
    • src 目录执行

redis 远程客户端

  1. Redis Desktop Manager:C++ 编写,响应迅速,性能好。
  2. Another Redis Desktop Manager

注意事项 :使用远程连接 redis 时,需要修改 redis.conf 配置文件:

  1. 备份一份配置文件:cp redis.conf bak_redis.conf
  2. bind ip 这一行注释掉
  3. protected-mode yes 保护模式改为 no
  4. 使用修改后的配置文件后台启动 redis(src 目录下):./redis-server ../redis.conf &

Redis 基本操作命令

沟通命令,查看状态

redis> ping [message]

作用:输入 ping,redis 返回 pong,表示 redis 服务运行正常。

返回:不加 message 为 PONG,加 message 为 message。

查看当前数据库中 key 的数量

redis> dbsize

作用:返回当前书库中的 key 的数量。

返回:数字,key 的数量。

redis 默认使用 16 个库

在 redis 配置文件中可以进行修改。

切换数据库命令

redis> select index

作用:切换到指定的数据库。

返回:OK

删除当前数据库中的所有数据

redis> flushdb

作用:清空当前数据库中的所有数据

返回:OK

redis 自带的客户端退出当前 redis 连接

redis> exit

redis> quit

作用:退出当前 redis 连接

Redis 的 Key 的操作命令

查找符合条件的 key

keys pattern

作用:查找所有符合模式 pattern 的 key,pattern 可以使用通配符。

返回:符合条件的 key。

判断一个或多个 key 是否存在

exists key [key...]

作用:判断 key 是否存在

返回:整数,返回存在的 key 的数量。

设置 key 的生存时间

expire key seconds

作用:设置 key 的生存时间,超过时间的 key 自动删除,单位是秒。

返回:设置成功返回 1,其他情况是 0。

查询 key 的剩余生存时间

ttl key

作用:time to live,返回 key 的剩余生存时间

返回:

  • -1 表示没有设置 key 的生存时间,key 永不过期;
  • -2 表示 key 不存在;
  • 数字 表示 key 的剩余时间,单位是秒。

查看 key 所存储值的数据类型

type key

作用:查看 key 对应值的数据类型

返回:

  • none 表示 key 不存在
  • string 表示 字符串
  • list 表示列表
  • set 表示集合
  • zset 表示有序集
  • hash 表示哈希表

删除存在的 key

del key [key...]

作用:删除存在的 key,不存在的 key 忽略。

返回:数字,删除的 key 的数量;不存在的 key 删除时返回 0。

Redis 的 5 种数据类型与操作命令

字符串类型 string

类型介绍

字符串类型是 Redis 中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据,序列化后的数据,JSON 化的对象甚至是一张图片。最大 512 M。

string

基本命令

  1. set

redis> set key value

作用:将字符串的值 value 设置到 key 中。

  1. get

redis> get key

作用:获取 key 中设置的字符串。

返回:不存在的 key 返回 (nil)

  1. incr

redis> incr key

作用:将 key 中储存的数字值加1,如果 key 不存在,则 key 的值先被初始化为 0 再执行 incr 操作。

返回:增加后的最终值。

注意:只能对数字类型的数据操作

  1. decr

redis> decr key

作用:将 key 中储存的数字值减1,如果 key 不存在,则么 key 的值先被初始化为 0 再执行 decr 操作。

返回:减少后的最终值。

注意:只能对数字类型的数据操作

  1. append

redis> append key value

作用:如果 key 存在,则将 value 追加到 key 原来旧值的末尾;如果 key 不存在,则将 key 设置值为 value。

返回:追加字符串之后的总长度。

常用命令

  1. strlen

redis> strlen key

作用:返回 key 所存储的字符串值的长度。

返回:如果 key 存在,返回字符串值的长度;如果 key 不存在,返回 0。

  1. getrange

redis> getrange key start end

作用:获取 key 中字符串值从 start 开始到 end 结束的子字符串,包括 start 和 end;负数表示从字符串的末尾开始,-1 表示最后一个字符。

返回:截取的子字符串。

例子:

redis> set username zhangsan
OK 

redis> getrange username 0 -2
"zhangsa"

redis> getrange username 2 100
"angsan"
  1. setrange

redis> setrange key offset value

作用:用 value 覆盖(替换)key 对应存储的值,起始位置从 offset 开始,不存在的 key 如果 offset > 0,则起始位置前的内容用空字符串填补。

返回:修改后的字符串的长度。

例子:不存在的 key

redis> setrange password 2 shenjingbing
(integer) 14

redis> get password
"\x00\x00shenjingbing"
  1. mset

redis> mset key value [key value...]

作用:同时设置一个或多个 kay-value 键值对。

返回:OK

  1. mget

redis>mget key [key...]

作用:获取所有给定 key 的值。

返回:包含所有 key 的列表。

哈希类型 hash

类型介绍

Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。

hash

基本命令

  1. hset

redis> hset key field value

作用:将 key 对应的 hash 表中的 field 设置为 value,如果 key 不存在,则新建 hash 表,执行 field、value 的赋值,如果有 field,则覆盖 value。

返回:

  • 如果 field 是 hash 表中的新 field,且设置值成功,返回 1。
  • 如果 field 已经存在,旧值覆盖新值,返回 0。
  1. hget

redis> hget key field

作用:获取 hash 表 key 中给定 field 的值。

返回:field 对应的 value 值,如果 key 不存在或者 field 不存在返回 nil。

  1. hmset

redis> hmset key field [field...]

作用:将 key 对应的 hash 表中的一个或多个 field 设置为 value,如果 key 不存在,则新建 hash 表,执行 field、value 的赋值,如果有 field,则覆盖 value。

返回:设置成功返回 ok , 如果失败返回一个错误

  1. hmget

redis> hmget key field [field...]

作用:获取 hash 表 key 中一个或多个 field 的值。

返回:返回和 field 顺序对应的值,如果 field 不存在,返回 nil。

  1. hgetall

redis> hgetall key

作用:获取 hash 表 key 中所有的 field 和 value。

返回:以列表形式返回 hash 中 field 和 value,key 不存在,返回空 hash(empty list or set)。

  1. hdel

redis> hdel key field [field...]

作用:删除哈希表 key 中的一个或多个指定域 field,不存在 field 直接忽略。

返回:成功删除的 field 的数量。

常用命令

  1. hkeys

redis> hkeys key

作用:获取指定 key 中的所有 field。

返回:如果 key 存在则返回对应的所有 field,如果 key 不存在则返回(empty list or set)。

  1. hvals

redis> hvals key

作用:返回 hash 表中所有 field 的值。

返回:包含 hash 表所有 field 的 value 的列表,key 不存在返回空列表(empty list or set)。

  1. hexists

redis> hexists key field

作用:查看 hash 表 key 中,给定域 field 是否存在。

返回:如果 field 存在,返回 1, 其他(key 或者 field 不存在)返回 0。

列表类型 list

类型介绍

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

list

基本命令

  1. lpush

redis> lpush key value [value...]

作用:将一个或多个值 value 插入到列表 key 的表头(最左边),从左边开始加入值,从左到右的顺序依次插入到表头,可以添加重复值。

返回:数字,新列表的长度

lpush

  1. rpush

redis> rpush key value [value...]

作用:将一个或多个值 value 插入到列表 key 的表尾(最右边),各个 value 值按从左到右的顺序依次插入到表尾,可以添加重复值。

返回:数字,新列表的长度

  1. lrange

redis> lrange key start stop

作用:获取列表 key 中指定区间内的元素,0 表示列表的第一个元素,以 1 表示列表的第二个元素;start , stop 是列表的下标值,也可以负数的下标, -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。 start,stop 超出列表的范围不会出现错误。

返回:指定区间的列表。

  1. lindex

redis> lindex key index

作用:获取列表 key 中下标为指定 index 的元素,列表元素不删除,只是查询。

返回:指定下标的元素;index 不在列表范围,返回 nil。

  1. llen

redis> llen key

作用:获取列表 key 的长度。

返回:数值,列表的长度;key 不存在返回 0。

常用命令

  1. lrem

redis> lrem key count value

作用:count 表示移除元素 value 的个数,count > 0 表示从列表的 左侧 向右开始移除;count < 0 表示从列表的尾部开始移除;count = 0 表示移除表中所有与 value 相等的值。

返回:数值,移除的元素个数。

  1. lset

redis> lset key index value

作用:将 key 对应的 list 中的 index 处的元素替换为 value。

返回:成功返回 OK,key 不存在返回(error ERR no such key),index 越界返回(error ERR index out of range)

  1. linsert

redis> linsert key before|after pivot value

作用:将 value 插入列表 key 当中值 pivot 之前还是之后,key 不存在或者 pivot 不存在,不执行任何操作。

返回:成功返回新列表的总长度,pivot 不存在返回 -1,key 不存在返回 0。

  1. lpop

redis> lpop key

作用:从最左侧删除一个 value。

返回:被删除的 value 值,没有值了返回 nil。

  1. rpop

redis> rpop key

作用:从最右侧删除一个 value。

返回:被删除的 value 值,没有值了返回 nil。

集合类型 set

类型介绍

Redis 的 Set 是 string 类型的 无序 集合,集合成员是唯一的,即集合中不能出现重复的数据。

set

基本命令

  1. sadd

redis> sadd key member [member...]

作用:将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略,不会再加入。

返回:加入到集合的新元素的个数,不包括被忽略的元素。

  1. smembers

redis> smembers key

作用:获取集合 key 中的所有成员元素,不存在的 key 视为空集合。

返回:所有成员元素。

  1. sismember

redis> sismember key member

作用:判断 member 元素是否是集合 key 的成员。

返回:member 是集合成员返回 1,其他返回 0。

  1. scard

redis> scard key

作用:获取集合里面的元素个数。

返回:数字,key的元素个数。 其他情况返回 0。

  1. srem

redis> srem key member [member...]

作用:删除集合 key 中的一个或多个 member 元素,不存在的元素被忽略。

返回:数字,成功删除的元素个数,不包括被忽略的元素。

常用命令

  1. srandmember

redis> srandmember key [count]

作用:只提供 key,随机返回集合中一个元素,元素不删除,依然在集合中;提供了 count 时,count 正数, 返回包含 count 个数元素的集合, 集合元素各不相同。count 是负数,返回一个 count 绝对值的长度的集合, 集合中元素可能会重复多次。

返回:一个元素;多个元素的集合。

  1. spop

redis> spop key [count]

作用:随机从集合中删除一个元素, count 是删除的元素个数。

返回:被删除的元素,key 不存在或空集合返回(empty list or set)。

有序集合类型 zset sorted set

类型介绍

Redis 有序集合 zset 和集合 set 一样也是 string 类型元素的集合,且不允许重复的成员。

不同的是 zset 的每个元素都会关联一个分数(分数可以重复),redis 通过分数来为集合中的成员进行从小到大的排序。

zset

基本命令

  1. zadd

redis> zadd key score member [score member...]

作用:将一个或多个 member 元素及其 score 值加入到有序集合 key 中,如果 member 存在集合中,则更新值;score 可以是整数或浮点数。

返回:数字,新添加的元素个数。

  1. zrange

redis> zrange key start stop [withscores]

作用:查询有序集合,指定区间的内的元素。集合成员按 score 值从小到大来排序。start, stop 都是从 0 开始。0 是第一个元素,1 是第二个元素,依次类推。以 -1 表示最后一个成员,-2 表示倒数第二个成员。WITHSCORES 选项让 score 和 value 一同返回。

返回:自定区间的成员集合。

  1. zrevrange

redis> zrevrange key start stop [withscores]

作用:返回有序集 key 中,指定区间内的成员。其中成员的位置按 score 值递减(从大到小)来排列。其它同zrange 命令。

返回:自定区间的成员集合。

  1. zrem

redis> zrem key member [member...]

作用:删除有序集合 key 中的一个或多个成员,不存在的成员被忽略。

返回:被成功删除的成员数量,不包括被忽略的成员。

  1. zcard

redis> zcard key

作用:获取有序集 key 的元素成员的个数。

返回:key 存在返回集合元素的个数,key 不存在,返回 0。

常用命令

  1. zrangebyscore

redis> zrangebyscore key min max [withscores] [limit offset count]

作用:获取有序集 key 中,所有 score 值介于 min 和 max 之间(包括 min 和 max)的成员,有序成员是按递增(从小到大)排序。min,max是包括在内,使用符号 ( 表示不包括。min,max 可以使用 -inf,+inf 表示最小和最大 limit 用来限制返回结果的数量和区间。withscores 显示 score 和 value。

返回:指定区间的集合数据。

  1. zrevrangebyscore

redis> zrevrangescore key min max [withscores] [limit offset count]

作用:返回有序集 key 中, score 值介于 max 和 min 之间(默认包括等于 max 或 min)的所有的成员。有序集成员按 score 值递减(从大到小)的次序排列。其他同 zrangebyscore。

返回:指定区间的集合数据。

  1. zcount

redis> zcount key min max

作用:返回有序集 key 中,score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max)的成员的数量。使用 ( 可以不包含 min 或 max,也可以使用 -inf,+inf 表示最小值和最大值。

返回:元素的个数。

Redis 事务

事务是指一系列操作步骤,这一系列的操作步骤,要么完全地执行,要么完全地不执行。

Redis 中的事务(transaction)是一组命令的集合,至少是 两个或两个以上 的命令,redis 事务保证这些命令被执行时中间不会被任何其他操作打断。

事务操作的命令

  1. multi

redis> multi

作用:标记一个事务的开始,事务内的多条命令会按照先后顺序被放进一个队列当中。

返回:总是返回 OK

  1. exec

redis> exec

作用:执行所有事务块内的命令。

返回:事务内的所有执行语句内容,事务被打断(影响)返回 nil。

  1. discard

redis> discard

作用:取消事务,放弃执行事务块内的所有命令。

返回:总是返回 OK

  1. watch

redis> watch key [key...]

作用:监视一个或多个 key,如果在事务执行之前这个或这些 key 被其他命令所改动,那么事务将被打断。

返回:总是返回 OK

  1. unwatch

redis> unwatch

作用:取消 watch 命令对所有 key 的监视,如果在执行 watch 命令之后,exec 命令或 discard 命令先被执行,那么就不需要再执行 unwatch 了。

返回:总是返回 OK

实现事务

事务正常执行

执行步骤:

  1. 开启事务
  2. 向事务队列中加入命令
  3. 执行事务提交

事务正常执行

事务执行exec之前,入队命令错误(语法错误;严重错误导致服务器不能正常工作(例如内存不足)),放弃事务。

结论:事务执行exec之前,入队命令错误,事务终止,取消,不执行。

exec 之前

事务执行exec命令后,执行队列命令,命令执行错误,事务提交

结论:在 exec 执行后的所产生的错误,即使事务中有某个/某些命令在执行时产生了错误,事务中的其他命令仍然会继续执行。Redis 在事务失败时不进行回滚,而是继续执行余下的命令。

Redis这种设计原则是:Redis 命令只会因为错误的语法而失败(这些问题不能在入队时发现),或是命令用在了错误类型的键上面,失败的命令并不是 Redis 导致,而是由编程错误造成的,这样错误应该在开发的过程中被发现,生产环境中不应出现语法的错误。就是在程序的运行环境中不应该出现语法的错误。而 Redis 能够保证正确的命令一定会被执行。再者不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。

Redis 的事务对除语法错误之外的错误概不负责!!!

exec 之后

放弃事务

放弃事务

Redis 的 watch 机制

watch 机制原理:

  1. 使用 watch 监视一个或多个 key,跟踪 key 的 value 修改情况,如果有 key 的 value 值在事务 exec 执行之前被修改了,整个事务被取消。exec 返回提示信息,表示事务已经失败。

  2. watch 机制使得事务 exec 变得有条件,