版权声明: 转载请注明出处!本文采用 知识共享 署名-非商业性使用-禁止演绎 4.0 国际许可协议
前言
操作集合的命令继续学习,今天有两个有意思的命令和一个之前重点讲过的命令,SPOP 命令看名字好像是从集合中弹出元素,那弹出的规则是怎样的, SRANDMEMBER 命令会随机得到一个集合元素,而 SSCAN 这个命令可以参考之前重点讲的 SCAN 命令。
这篇笔记中的3个命令分别是 SPOP 、 SRANDMEMBER 、 SSCAN ,可以参考:
- 《Redis每日一练(22):LPOP、RPUSH和RPOP命令》 中的 LPOP 命令
- 《Redis每日一练(15):SCAN命令》 中的 SCAN 命令
SPOP
- 最早出现版本:1.0.0
- 时间复杂度:O(1)
- 命令参数:SPOP key [count]
- 操作类型:sets
- 官方文档
作用
从集合中弹出一个元素,弹出的规则居然是随机选一个,这也难怪,毕竟普通的集合没有顺序,要弹出元素就随便弹出一个吧。
当版本大于等于3.2时,可以使用 count 参数,指定一次弹出多个元素,命令最后返回弹出的元素,如果指定的键不存在返回nil。
当指定的键不是集合时会给出报错信息,如果指定的 count 大于等于集合元素个数,会返回整个集合的元素。
练习
新建一个集合使用 SPOP 移除元素试试:
127.0.0.1:6379> DEL seta (integer) 1 127.0.0.1:6379> SADD seta a b hehe bad (integer) 4 127.0.0.1:6379> SADD seta 110 119 (integer) 2 127.0.0.1:6379> SMEMBERS seta 1) "bad" 2) "b" 3) "hehe" 4) "a" 5) "119" 6) "110" 127.0.0.1:6379> SPOP seta 2 1) "110" 2) "119" 127.0.0.1:6379> SMEMBERS seta 1) "a" 2) "b" 3) "bad" 4) "hehe" 127.0.0.1:6379> SPOP seta "hehe" 127.0.0.1:6379> SPOP seta "a" 127.0.0.1:6379> SMEMBERS seta 1) "b" 2) "bad" 127.0.0.1:6379>
复制
对一个不存在的键使用 SPOP 命令返回nil。
127.0.0.1:6379> DEL seta (integer) 1 127.0.0.1:6379> SPOP seta (nil) 127.0.0.1:6379>
复制
SRANDMEMBER
- 最早出现版本:1.0.0
- 时间复杂度:O(N) (如果不使用count参数为O(1))
- 命令参数:SRANDMEMBER key [count]
- 操作类型:sets
- 官方文档
作用
随机返回集合中的一个元素,但是不改变原来集合的内容。
当版本大于等于2.6时,增加了 count 这个参数,当 count 是一个正数时,会随机返回 count 个不重复的集合元素,当 count 是负数时,会随机返回 -count 个可能重复的集合元素。
如果没有 count 参数,当指定的键不存在时返回nil,如果指定了 count 参数,当指定的键不存在时,返回一个空的列表。
练习
使用 SADD 命令创建1个多元素的集合,然后使用 SRANDMEMBER 查看结果:
127.0.0.1:6379> SADD seta apple book (integer) 2 127.0.0.1:6379> SADD seta 4 404 501 0 (integer) 4 127.0.0.1:6379> SMEMBERS seta 1) "book" 2) "apple" 3) "4" 4) "404" 5) "0" 6) "501" 127.0.0.1:6379> SRANDMEMBER seta 2 1) "404" 2) "book" 127.0.0.1:6379> SRANDMEMBER seta 2 1) "404" 2) "book" 127.0.0.1:6379> SRANDMEMBER seta 2 1) "0" 2) "4" 127.0.0.1:6379> SRANDMEMBER seta -4 1) "book" 2) "0" 3) "book" 4) "501" 127.0.0.1:6379>
复制
当指定的键不存在时,使用 SRANDMEMBER 命令查看返回值
127.0.0.1:6379> DEL setb (integer) 1 127.0.0.1:6379> SRANDMEMBER setb (nil) 127.0.0.1:6379> SRANDMEMBER setb 4 (empty list or set) 127.0.0.1:6379>
复制
SSCAN
- 最早出现版本:2.8.0
- 时间复杂度:O(1) (对于每一次迭代来说,完整迭代是O(n))
- 命令参数:SSCAN key cursor [MATCH pattern] [COUNT count]
- 操作类型:sets
- 官方文档
作用
这个命令的作用就是分段迭代整个集合的元素,避免因集合元素过多时,完整一次遍历造成卡顿,具体用法可以参考 SSCAN 命令讲解,《Redis每日一练(15):SCAN命令》。
SSCAN 命令的使用方式和 SCAN 命令的使用方式基本一致,只是 SCAN 命令是用来查询数据库中所有的键的,而 SSCAN 命令是用来查询一个集合的所有元素。
练习
对一个集合调用 SSCAN 命令,分段迭代整个集合:
127.0.0.1:6379> DEL seta (integer) 1 127.0.0.1:6379> SADD seta 404 501 110 711 996 (integer) 5 127.0.0.1:6379> SADD seta good kill pid item (integer) 4 127.0.0.1:6379> SADD seta b4 after (integer) 2 127.0.0.1:6379> SSCAN seta 0 1) "0" 2) 1) "404" 2) "110" 3) "b4" 4) "after" 5) "kill" 6) "pid" 7) "711" 8) "good" 9) "item" 10) "996" 11) "501" 127.0.0.1:6379> SSCAN seta 0 COUNT 5 1) "7" 2) 1) "404" 2) "110" 3) "b4" 4) "after" 5) "kill" 6) "pid" 7) "711" 8) "good" 9) "item" 127.0.0.1:6379> SSCAN seta 7 COUNT 5 1) "0" 2) 1) "996" 2) "501" 127.0.0.1:6379>
复制
总结
- SPOP 命令可以随机从集合中移除指定个数元素,并将这些元素返回。
- SRANDMEMBER 命令可以随机从集合中选取指定个数元素,并将这些元素返回,但是不改变集合本身。
- SSCAN 命令可以分段迭代整个集合,避免操作大集合造成卡顿。
2020-1-1 22:56:35