内存数据库 Redis7
- 三、Redis 命令
- 3.1 Redis 基本命令
- 3.2 Key 操作命令
- 3.3 String 型 Value 操作命令
- 3.4 Hash 型 Value 操作命令
- 3.5 List 型 Value 操作命令
- 3.6 Set 型 Value 操作命令
- 3.7 有序Set 型 Value 操作命令
- 3.8 benchmark 测试工具
- 3.9 简单动态字符串SDS
- 3.10 集合的底层实现原理
- 3.11 BitMap 操作命令
- 3.12 HyperLogLog 操作命令
- 3.13 Geospatial 操作命令
- 3.14 发布/订阅命令
- 3.15 Redis 事务
- 四、Redis 持久化
- 五、Redis 主从集群
- 六、Redis 分布式系统
- 七、Redis 缓存
- 八、Lua脚本详解
- 九、分布式锁
数据库系列文章:
关系型数据库:
- MySQL —— 基础语法大全
- MySQL —— 进阶
非关系型数据库:
- Redis 的安装与配置
三、Redis 命令
Redis 根据命令所操作对象的不同,可以分为三大类:对 Redis 进行基础性操作的命令,对 Key
的操作命令,对 Value
的操作命令。
3.1 Redis 基本命令
⭐️ 3.1.1、 心跳命令 ping
- 键入
ping
命令,会看到PONG
响应,则说明该客户端与 Redis 的连接是正常的。该命令亦称为 心跳命令。
⭐️ 3.1.2、读写键值命令
set key value
会将指定key value
写入到 DB 。get key
则会读取指定key
的value
值。关于更多set
与get
命令格式,后面会详细学习。
⭐️ 3.1.3、 DB切换 select
- Redis 默认有 16 个数据库。这个在 Redis Desktop Manager (RDM)图形客户端中可以直观地看到。
- 默认使用的是
0
号 DB ,可以通过select db
索引来切换 DB 。- 例如,如下命令会
select 3
切换到 DB3 ,并会将age-23
写入到 DB3 中。
- 例如,如下命令会
- 并且 这个结果在 RDM 中是可以直观地看到的。
⭐️ 3.1.4、 查看 key 数量 dbsize
dbsize
命令可以查看 当前数据库 中key
的数量。
- 从以上查看情况看, DB0 中有 2 个
key
; DB1 中没有key
; DB3 中有 1 个key
。
⭐️ 3.1.5、 删除当前库中数据 flushdb
flushdb
命令仅仅 删除的是当前数据库中的数据,不影响其它库。
⭐️ 3.1.6、 删除所有库中数据命令 flushall
flushall
命令可以删除所有库中的所有数据。所以该命令的使用一定要慎重。
⭐️ 3.1.7、 退出客户端命令
- 使用
exit
或quit
命令均可退出 Redis 命令行客户端。
3.2 Key 操作命令
Redis 中 存储的数据整体 是一个 Map
,其 key
为 String
类型,而 value
则可以是 String
、Hash 表
、 List
、 Set
等类型。
⭐️ 3.2.1、keys
- 格式:
KEYS pattern
- 功能:查找所有符合给定模式
pattern
的key
,pattern
为 正则表达式 。 - 说明:
KEYS
的速度非常快,但在一个 大的数据库 中使用它 可能会 阻塞 当前服务器的服务 。 所以生产环境中一般不使用该命令,而使用scan
命令代替。
⭐️ 3.2.2、exists
- 格式:
EXISTS key
- 功能:检查给定
key
是否存在。 - 说明:若
key
存在,返回1
,否则返回0
。
⭐️ 3.2.3、del
- 格式:
DEL key [key ...]
- 功能:删除给定的一个或多个
key
。不存在的key
会被忽略。 - 说明: 返回 被删除
key
的数量。
⭐️ 3.2.4、rename
- 格式:
RENAME key newkey
- 功能:将
key
改名为newkey
。 - 说明:当
key
和newkey
相同,或者key
不存在时,返回一个错误。当 newkey
已经存在时,RENAME
命令将覆盖旧值。改名成功时提示OK
,失败时候返回一个错误。
⭐️ 3.2.5、move
- 格式:
MOVE key db
- 功能:将当前数据库的
key
移动 到 给定的数据库 db 当中。 - 说明: 如果 当前数据库(源数据库) 和 给定数据库(目标数据库) 有相同名字的给定
key
,或者key
不存在于 当前数据库,那么MOVE
没有任何效果。 移动成功返回1
,失败则返回0
。
⭐️ 3.2.6、type
- 格式:
TYPE key
- 功能:返回
key
所储存的 值的类型。 - 说明: 返回值有以下六种
none
(key
不存在)string
字符串list
列表set
集合zset
有序集hash
哈希表
⭐️ 3.2.7、expire 与 pexpire
- 格式:
EXPIRE key seconds
- 功能:为给定
key
设置生存时间 。 当key
过期时 (生存时间为 0),它会被自动删除。expire
的时间单位为秒
,pexpire
的时间单位为毫秒
。- 在 Redis 中,带有生存时间的
key
被称为 "易失的” (volatile
)。
- 说明: 生存时间 设置成功返回 1 。 若
key
不存在时 返回 0 。rename
操作不会改变key
的生存时间。
⭐️ 3.2.8、ttl 与 pttl
- 格式:
TTL key
- 功能:
TTL
,time to live
,返回给定key
的 剩余生存时间。 - 说明:其返回值存在三种可能:
- 当
key
不存在时,返回-2
。 - 当
key
存在但没有设置剩余生存时间时,返回-1
。 - 否则,返回
key
的剩余生存时间。ttl
命令返回的时间单位为秒
,而pttl
命令返回的时间单位为毫秒
。
- 当
⭐️ 3.2.9、persist
- 格式:
PERSIST key
- 功能:去除给定
key
的生存时间,将这个key
从 “易失的” 转换成 “持久的” 。 - 说明: 当生存时间移除成功时,返回 1 ;若
key
不存在或key
没有设置生存时间, 则返回 0 。
⭐️ 3.2.10、randomkey
- 格式:
RANDOMKEY
- 功能:从当前数据库中随机返回 不删除 一个
key
。 - 说明: 当数据库不为空时,返回一个
key
。当数据库为空时,返回nil
。
⭐️ 3.2.11、scan
- 格式:
SCAN cursor [MATCH pattern] [COUNT count] [TYPE]
- 功能:用于迭代数据库中的 数据库键。 其各个选项的意义为:
cursor
:本次迭代开始的 游标。pattern
:本次迭代要 匹配的key
的模式。count
:本次迭代要从数据集里返回多少元素,默认值为10
。type
本次迭代要返回的value
的类型,默认为所有类型
。
SCAN 命令是一个基于游标
cursor
的迭代器:
- SCAN 命令每次被调用之后,都会向用户返回一个 包含两个元素的数组, 第一个元素是用于进行下一次迭代的新游标,而第二个元素则是一个数组, 这个数组中包含了所有被迭代的元素。 用户在下次迭代时需要使用这个新游标作为
SCAN
命令的游标参数,以此来延续之前的迭代程。- 当 SCAN 命令的游标参数被设置为 0 时,服务器将开始一次新的迭代。 如果新游标返回 0 表示迭代已结束。
- 说明: 使用间断的、负数、超出范围 或者 其他非正常 的游标来执行 增量式迭代 不会造成服务器崩溃。
当数据量很大时,
count
的数量的指定可能会不起作用, Redis 会自动调整每次的遍历数目。 由于 scan 命令 每次执行都只会返回少量元素,所以该命令可以用于生产环境,而不会出现像KEYS
命令带来的服务器阻塞问题。
增量式迭代命令 所使用的算法只保证在数据集的大小有界的情况下迭代才会停止,换句话说,如果被迭代数据集的大小不断地增长的话,增量式迭代命令可能永远也无法完成一次完整迭代。 即 当一个数据集不断地变大时,想要访问这个数据集中 的所有元素就需要做越来越多的工作, 能否结束一个迭代取决于用户执行迭代的速度是否比数据集增长的速度更快。
相关命令:另外还有 3 个 scan 命令用于对三种类型的value
进行遍历。
hscan
:属于Hash
型Value
操作命令集合,用于遍历当前 db 中指定Hash 表
的所有field-value
对。sscan
:属于Set
型Value
操作命令集合,用于 遍历当前 db 中指定set 集合
的所有元素zscan
:属于ZSet
型Value
操作命令集合,用于 遍历当前 db 中指定有序集合
的所有元素(数值与元素值)
3.3 String 型 Value 操作命令
Redis 存储数据的 Value
可以是 一个 String
类型数据。 String
类型的 Value
是 Redis 中最基本,最常见的类型。 String
类型的 Valu
e 中可以存放任意数据, 包括 数值型
,甚至是二进制的 图片
、音频
、视频
、序列化对象
等。一个 String
类型的 Value
最大是 512M 大小。
⭐️ 3.3.1、set
- 格式:
SET key value [EX seconds | PX milliseconds] [NX|XX]
- 功能:
SET
除了可以直接将key
的值设为value
外,还可以指定一些参数。EX seconds
:为当前key
设置过期时间,单位秒
。等价于SETEX
命令。PX milliseconds
:为当前key
设置过期时间,单位毫秒
。等价于PSETEX
命令。NX
:(No eXist
) 指定的key
不存在才会设置成功,用于添加指定的key
。等价于SETNX
命令。XX
:指定的key
必须存在才会设置成功,用于更新指定key
的value
。
- 说明:如果
value
字符串中带有空格,则该字符串需要使用双引号或单引号引起来,否则会认为set
命令的参数数量不正确,报错。
⭐️ 3.3.2、setex 与 psetex
- 格式:
SETEX / PSETEX key seconds value
- 功能:
set expire
,其不仅为key
指定了value
,还为其设置了生存时间。setex
的单位为秒
,psetex
的单位为毫秒
。 - 说明:如果
key
已经存在, 则覆写旧值。该命令类似于以下两个命令,不同之处是,SETEX
是一个原子性操作,关联值 和 设置生存时间两个动作会在同一时间内完成,该命令在 Redis 用作缓存时,非常实用。SET key value
EXPIRE key seconds
#设置生存时间
⭐️ 3.3.3、setnx
- 格式:
SETNX key value
- 功能:
SET if Not eXists
,将key
的值设为value
,当且仅当key
不存在。若给定的key
已经存在,则SETNX
不做任何动作。 成功,返回 1 ,否则 ,返回 0 。 - 说明:该命令等价于
set key value nx
⭐️ 3.3.4、getset
- 格式:
GETSET key value
- 功能:将给定
key
的值设为value
,并返回key
的旧值。 - 说明:当
key
存在但不是字符串类型时,返回一个错误; 当key
不存在时,返回nil
。
⭐️ 3.3.5、mset 与 msetnx
- 格式:
MSET / MSETNX key value [key value ...]
- 功能:同时设置一个或多个
key-value
对。 - 说明:如果某个给定
key
已经存在,那么MSET
会用 新值覆盖原来的旧值,如果这不是你所希望的效果,请考虑使用MSETNX
命令:它只会在所有给定key
都不存在的情况下进行设置操作。MSET/MSETNX
是一个原子性 (atomic) 操作,所有给定key
都会在同一时间内被设置,某些给定key
被更新而另一些给定key
没有改变的情况不可能发生。该命令永不失败。
⭐️ 3.3.6、mget
- 格式:
MGET key [key ...]
- 功能:返回所有 (一个或多个) 给定
key
的值。 - 说明:说明:如果给定的
key
里面,有某个key
不存在,那么这个key
返回特殊值nil
。因此,该命令永不失败。
⭐️ 3.3.7、append
- 格式:
APPEND key value
- 功能:如果
key
已经存在并且是一个字符串,APPEND
命令将value
追加到key
原来的值的末尾。如果key
不存在,APPEND
就简单地将给定key
设为value
,就像执行SET key value
一样。 - 说明:追加
value
之后,key
中字符串的长度。
⭐️ 3.3.8、incr 与 decr
- 格式:
INCR key
或DECR key
- 功能:
increment
,自动递增。 将key
中存储的数字值增一。decrement
,自动递减。将 key 中存储的数字值减一。 - 说明:如果
key
不存在,那么key
的值会先被初始化为0
,然后再执行增一/减一
操作。如果值不能表示为数字,那么返回一个错误提示。如果执行正确,则返回增一/减一 后的值。
⭐️ 3.3.9、incrby 与 decrby
- 格式:
INCRBY key increment
或DECRBY key decrement
- 功能:将
key
中存储的数字值增加/减少
指定的数值,这个数值只能是整数,可以是负数,但不能是小数。 - 说明:如果
key
不存在,那么key
的值会先被初始化为0
,然后再执行增/减
操作。如果值不能表示为数字,那么返回一个错误提示。如果执行正确,则返回增/减
后的值。
⭐️ 3.3.10、incrbyfloat
- 格式:
INCRBYFLOAT key increment
- 功能:为
key
中所储存的值加上 浮点数增量increment
。 - 说明:与之前的说明相同。没有
decrbyfloat
命令,但increment
为负数可以实现减操作效果。
⭐️ 3.3.11、strlen
- 格式:
STRLEN key
- 功能:返回
key
所储存的字符串值的长度。 - 说明:当
key
储存的不是字符串值时,返回一个错误,当key
不存在时,返回0
。
⭐️ 3.3.12、getrange
- 格式:
GETRANGE key start end
- 功能:返回
key
中字符串值的 子字符串,字符串的截取范围由start
和end
两个偏移量决定 包括start
和end
在内。 - 说明:
end
必须要比start
大。支持 负数偏移量 表示从字符串最后开始计数,-1
表示最后一个字符,-2
表示倒数第二个,以此类推。
⭐️ 3.3.13、setrange
- 格式:
SETRANGE key offset value
- 功能:用
value
参数替换给定key
所储存的字符串值str
,从偏移量offset
开始。 - 说明:当
offset
值大于str
长度时,中间使用零字节\x00
填充,即0000 0000
字节填充;对于不存在的key
当作空串处理。
⭐️ 3.3.14、位运算命令
- 名称中包含
BIT
的命令,都是对二进制位的操作命令,例如,setbit
、getbit
、bitcount
、bittop
、bitfield
,这些命令不常用。
⭐️ 3.3.15、典型应用场景
Value 为 String
类型的 应用场景很多,这里仅举这种 典型应用场景 的例子:
-
1)、数据缓存
- Redis 作为数据缓存层, MySQL 作为 数据存储层。应用服务器首先从 Redis 中获取数据,如果缓存层中没有,则从 MySQL 中获取后先存入缓存层再返回给应用服务器。
-
2)、计数器
- 在 Redis 中写入一个
value
为数值型的key
作为平台计数器、视频播放计数器等。每个有效客户端访问一次,或视频每播放一次,都是直接修改 Redis 中的计数器,然后再以 异步方式 持久化 到其它数据源中,例如持久化到 MySQL 。
- 在 Redis 中写入一个
-
3)、共享 Session
- 对于一个分布式应用系统,如果将类似用户登录信息这样的 Session 数据保存在提供登录服务的服务器中,那么如果用户再次提交像收藏、支付等请求时可能会出现问题:在提供收藏、支付等服务的服务器中并没有该用户的 Session 数据,从而导致该用户需要重新登录。对于用户来说,这是不能接受的。
- 此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从 Redis 中查找相应的 Session 数据,如果存在,则再进行相关操作,否则跳转到 登录页面。这样就不会引发“重新登录”问题。
-
4)、限速器
- 现在很多平台为了 防止DoS (
Denial of Service
,拒绝服务) 攻击,一般都会限制一个IP
不能在一秒内访问超过n
次。而 Redis 可以可以结合key
的 过期时间 与incr
命令来完成 限速功能,充当限速器。
- 现在很多平台为了 防止DoS (
注意,其无法 防止 DDoS (
Distributed Denial of Service
,分布式拒绝服务)攻击。( 多个ip
同时访问 )
//客户端每提交一次请求,都会执行下面的代码//指定新 ip 作为 key 的缓存过期时间为 60 秒
boolean isExists = redis.set(ip, 1, "EX 60", "NX"); //等价于 set 192.168.192.55 1 ex 60 nxif(isExists != null || redis.incr(ip) <= 5) {// 通过
} else {// 限流
}
3.4 Hash 型 Value 操作命令
Redis 存储数据的 Value
可以是一个 Hash 类型
。 Hash 类型
也称为 Hash 表
、字典
等。
Hash表
就是一个 映射表 Map 也是由键-值
对构成 ,为了与整体的key
进行区分,这里的键称为field
,值称为value
。 注意, Redis 的 Hash 表中的field-value
对 均为String
类型。
⭐️ 3.4.1、hset
- 格式:
HSET key field value
- 功能:将哈希表
key
中的域field
的值设为value
。 - 说明:如果
key
不存在,一个新的哈希表被创建并进行HSET
操作。如果域field
已经存在于哈希表中,旧值将被覆盖。 如果field
是哈希表中的一个新建域,并且值设置成功,返回 1 。如果哈希表中域field
已经存在 且 旧值已被新值覆盖,返回0
。
⭐️ 3.4.2、hget
- 格式:
HGET key field
- 功能:返回哈希表
key
中给定域field
的值。 - 说明:当给定域 不存在 或是 给定
key
不存在时,返回nil
。
⭐️ 3.4.3、hmset
- 格式:
HMSET key field value [field value ...]
- 功能:同时将多个
field-value
(域-值) 对设置到哈希表key
中。 - 说明:此命令会覆盖哈希表中已存在的域。如果
key
不存在,一个空哈希表被创建并执行HMSET
操作。 如果命令执行成功,返回 OK 。当key
不是哈希表 (hash
) 类型时,返回一个错误。
⭐️ 3.4.4、hmget
- 格式:
HMGET key field [field ...]
- 功能:按照给出顺序返回哈希表
key
中一个或多个域的值。 - 说明:如果给定的域不存在于哈希表,那么返回一个
nil
值。因为不存在的key
被当作一个空哈希表来处理,所以对一个不存在的key
进行HMGET
操作将返回一个只带有nil
值的表。
⭐️ 3.4.5、hgetall
- 格式:
HGETALL key
- 功能:返回哈希表
key
中所有的 域和值。 - 说明:在返回值里,紧跟每个域名 (
field name
) 之后是域的值 (value
),所以返回值的长度是哈希表大小的两倍。若key
不存在,返回空列表。 若key
中包含大量元素,则该命令 可能会阻塞 Redis 服务。 所以生产环境中 一般不使用该命令,而使用hscan
命令代替。
⭐️ 3.4.6、hsetnx
- 格式:
HSETNX key field value
- 功能:将哈希表
key
中的域field
的值设置为value
,当且仅当 域field
不存在。 - 说明:若域
field
已经存在,该操作无效。如果key
不存在,一个新哈希表被创建并执行HSETNX
命令。
⭐️ 3.4.7、hdel
- 格式:
HDEL key field [field ...]
- 功能:删除哈希表
key
中的一个或多个指定域,不存在的域将被忽略。 - 说明:返回被成功移除的域的数量,不包括被忽略的域。
⭐️ 3.4.8、hexists
- 格式:
HEXISTS key field
- 功能:查看哈希表
key
中给定域field
是否存在。 - 说明:如果哈希表含有给定域,返回 1 。如果不含有给定域,或
key
不存在,返回 0 。
⭐️ 3.4.9、hincrby 与 hincrbyfloat
- 格式:
HINCRBY key field increment
- 功能:为哈希表
key
中的域field
的值加上增量increment
。hincrby
命令只能增加整数值,而hincrbyfloat
可以增加小数值。 - 说明:增量也可以为负数,相当于对给定域进行减法操作。如果
key
不存在,一个新的哈希表被创建并执行HINCRBY
命令。如果域field
不存在,那么在执行命令前,域的值 被初始化为 0 。对一个储存字符串值的域field
执行HINCRBY
命令将 造成一个错误。
⭐️ 3.4.10、hkeys 与 hvals
- 格式:
HKEYS key
或HVALS key
- 功能:返回哈希表
key
中的所有域 / 值 。 - 说明:当
key
不存在时,返回一个空表。
⭐️ 3.4.11、hlen
- 格式:
HLEN key
- 功能:返回哈希表
key
中域的数量。 - 说明:当
key
不存在时,返回 0 。
⭐️ 3.4.12、hstrlen
- 格式:
HSTRLEN key field
- 功能:返回哈希表
key
中, 与给定域field
相关联的值 的字符串长度(string length
)。 - 说明:如果给定的 键 或者 域 不存在, 那么命令返回 0。
⭐️ 3.4.13、应用场景
Hash型
Value 非常适合存储 对象数据。key
为对象名称,value
为描述对象属性的Map
,对对象属性的修改在 Redis 中就可直接完成。- 其不像
String 型
Value 存储对象,那个对象是 序列化过的,例如序列化为JSON
串,对对象属性值的修改需要先 反序列化为对象后再修改,修改后再序列化为JSON
串后写入到 Redis 。
3.5 List 型 Value 操作命令
Redis 存储数据的 Value 可以是 一个 String 列表
类型数据。 即该 列表中的每个元素 均为 String
类型数据。
- 列表中的数据会按照插入顺序 进行排序。
- 不过,该列表的底层实际是一个 无头节点 的 双向链表,所以对列表 表头与表尾 的操作性能较高,但对 中间元素 的插入与删除的 操作的性能相对较差。
⭐️ 3.5.1、lpush/rpush
- 格式:
LPUSH key value [value ...]
或RPUSH key value [value ...]
- 功能:将一个或多个值
value
插入到列表key
的 表头 / 表尾(表头在左,表尾在右) - 说明:如果有多个
value
值,对于lpush
来说, 各个value
会按 从左到右的顺序 依次插入到表头;对于rpush
来说, 各个value
会按 从左到右的顺序 依次插入到表尾。如果key
不存在,一个空列表会被创建并执行操作。当key
存在但不是列表类型时,返回一个错误。执行成功时返回列表的长度。
⭐️ 3.5.2、llen
- 格式:
LLEN key
- 功能:返回列表
key
的长度。 - 说明:如果
key
不存在,则key
被解释为一个空列表,返回 0 。 如果key
不是列表类型,返回一个错误。
⭐️ 3.5.3、lindex
- 格式:
LINDEX key index
- 功能:返回列表
key
中,下标为index
的元素。 列表从 0 开始计数。 - 说明:如果
index
参数的值不在列表的区间范围内 (out of range
),返回nil
。
⭐️ 3.5.4、lset
- 格式:
LSET key index value
- 功能:将列表
key
下标为index
的元素的值设置为value
。 - 说明:当
index
参数超出范围,或对一个 空列表(key
不存在)进行LSET
时,返回一个错误。
⭐️ 3.5.5、lrange
- 格式:
LRANGE key start stop
- 功能:返回列表
key
中指定区间[start, stop]
内的元素 ,即包含两个端点 。 - 说明:
List
的下标从 0 开始,即 以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。也可以使用负数下标,以-1
表示列表的最后一个元素,-2
表示列表的倒数第二个元素,以此类推。 超出范围的下标值不会引起错误。如果start
下标比列表的最大下标 还要大,那么LRANGE
返回一个空列表。如果stop
下标比最大下标还要大, Redis 将stop
的值设置为最大下标。
⭐️ 3.5.6、lpushx 与 rpushx
- 格式:
LPUSHX key value
或RPUSHX key value
- 功能:将值
value
插入到列表key
的 表头 / 表尾 ,当且仅当key
存在并且是一个列表。 - 说明:当
key
不存在时,命令什么也不做。若执行成功,则输出表的长度。
⭐️ 3.5.7、linsert
- 格式:
LINSERT key BEFORE | AFTER pivot value
- 功能:将值
value
插入到列表key
当中,位于元素pivot
之前或之后。 - 说明:当
pivot
元素 不存在 于列表中时,不执行任何操作,返回-1
; 当key
不存在时,key
被视为空列表,不执行任何操作,返回0
;如果key
不是列表类型,返回一个错误;如果命令执行成功,返回插入操作完成之后,列表的长度。
⭐️ 3.5.8、lpop / rpop
- 格式:
LPOP key [count]
或RPOP key [count]
- 功能:从列表
key
的 表头 / 表尾 移除count
个元素, 并返回 移除的元素 。count
默认值1
- 说明:当
key
不存在时,返回nil
⭐️ 3.5.9、blpop / brpop
- 格式:
BLPOP key [key ...] timeout
或BRPOP key [key ...] timeout
- 功能:
BLPOP / BRPOP
是列表的阻塞式 (blocking
) 弹出命令。它们是LPOP / RPOP
命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被BLPOP / BRPOP
命令 阻塞,直到等待timeout
超时 或 发现可弹出元素为止。当给定多个key
参数时,按参数key
的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。timeout
为阻塞时长,单位为秒
,其值若为 0 ,则表示只要没有可弹出元素,则一直阻塞。 - 说明:假如在指定时间内没有任何元素被弹出,则返回一个
nil
和 等待时长。反之,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的key
,第二个元素是被弹出元素的值。
⭐️ 3.5.10、rpoplpush
- 格式:
RPOPLPUSH source destination
- 功能:命令
RPOPLPUSH
在一个原子时间内,执行以下两个动作:- 将列表
source
中的最后一个元素 (尾元素) 弹出,并返回给客户端。 - 将
source
弹出的元素插入到列表destination
,作为destination
列表的的头元素。
- 将列表
- 说明:如果
source
不存在,值nil
被返回,并且不执行其他动作。如果source
和destination
相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊情况视作列表的旋转 (rotation
) 操作。
⭐️ 3.5.11、brpoplpush
- 格式:
BRPOPLPUSH source destination timeout
- 功能:
BRPOPLPUSH
是RPOPLPUSH
的 阻塞版本,当给定列表source
不为空时,BRPOPLPUSH
的表现和RPOPLPUSH
一样。当列表source
为空时,BRPOPLPUSH
命令将阻塞连接,直到等待超时,或有另一个客户端对source
执行LPUSH
或RPUSH
命令为止。timeout
为阻塞时长,单位为秒
,其值若为 0 ,则表示只要没有可弹出元素,则一直阻塞。 - 说明:假如在指定时间内没有任何元素被弹出,则返回一个
nil
和等待时长
。反之,返回一个含有两个元素的列表,第一个元素是 被弹出元素的值,第二个元素是 等待时长。
⭐️ 3.5.12、lrem
- 格式:
LREM key count value
- 功能:根据参数
count
的值,移除列表中与参数value
相等的元素。count
的值可以是以下几种:count > 0
: 从 表头开始向表尾 搜索,移除与value
相等的元素,数量为count
。count < 0
: 从 表尾开始向表头 搜索,移除与value
相等的元素,数量为count
的绝对值。count = 0
: 移除 表中所有与value
相等的值。
- 说明:返回被移除元素的数量。当
key
不存在时,LREM
命令返回 0 ,因为不存在的key
被视作空表 (empty list
) 。
⭐️ 3.5.13、itrim
- 格式:
LTRIM key start stop
- 功能:对一个列表进行修剪 (
trim
),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。 - 说明:下标 (
index
) 参数start
和stop
都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。 也 可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。当key
不是列表类型时,返回一个错误。 如果start
下标比列表的最大下标end
(LLEN
list
减去 1 ) 还要大,或者start > stop
,LTRIM
返回 一个空列表, 因为LTRIM
已经将整个列表清空。如果stop
下标比end
下标还要大, Redis 将stop
的值设置为end
。
⭐️ 3.5.14、应用场景
Value 为 List 类型
的应用场景很多, 主要是通过 构建不同的数据结构 来实现相应的业务功能。 这里仅对这些 数据结构的实现方式 进行总结,不举具体的例子。
-
1)、栈
-
2)、队列
-
3)、阻塞式消息队列
-
4)、动态有限集合
3.6 Set 型 Value 操作命令
⭐️ 3.6.1、sadd
- 格式:``
- 功能:
- 说明:
⭐️ 3.6.2、smembers
⭐️ 3.6.3、scard
⭐️ 3.6.4、sismember
⭐️ 3.6.5、smove
⭐️ 3.6.6、srem
⭐️ 3.6.7、srandmember
⭐️ 3.6.8、spop
⭐️ 3.6.9、sdiff / sdiffstore
⭐️ 3.6.10、sinter / sinterstore
⭐️ 3.6.11、sunion / sunionstore
⭐️ 3.6.12、应用场景
3.7 有序Set 型 Value 操作命令
⭐️ 3.7.1、zadd
⭐️ 3.7.2、zrange 与 zrevrange
⭐️ 3.7.3、zrangebyscore 与 zrevrangebyscore
⭐️ 3.7.4、zcard
⭐️ 3.7.5、zcount
⭐️ 3.7.6、zscore
⭐️ 3.7.7、zincrby
⭐️ 3.7.8、zrank 与 zrevrank
⭐️ 3.7.9、zrem
⭐️ 3.7.10、zremrangebyrank
⭐️ 3.7.11、zremrangebyscore
⭐️ 3.7.12、zrangebylex
⭐️ 3.7.13、zlexcount
⭐️ 3.7.14、zremrangebylex
⭐️ 3.7.、
⭐️ 3.7.、
⭐️ 3.7.、
3.8 benchmark 测试工具
3.9 简单动态字符串SDS
3.10 集合的底层实现原理
3.11 BitMap 操作命令
3.12 HyperLogLog 操作命令
3.13 Geospatial 操作命令
3.14 发布/订阅命令
3.15 Redis 事务
🚀🚀🚀 Redis 命令 快速食用:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------->
四、Redis 持久化
🚀🚀🚀 Redis 持久化 快速食用:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------->