暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis每日一练(30):SPOP、SRANDMEMBER和SSCAN命令

原创 AlbertS 2020-01-01
2339

版权声明: 转载请注明出处!本文采用 知识共享 署名-非商业性使用-禁止演绎 4.0 国际许可协议

前言

操作集合的命令继续学习,今天有两个有意思的命令和一个之前重点讲过的命令,SPOP 命令看名字好像是从集合中弹出元素,那弹出的规则是怎样的, SRANDMEMBER 命令会随机得到一个集合元素,而 SSCAN 这个命令可以参考之前重点讲的 SCAN 命令。

这篇笔记中的3个命令分别是 SPOP 、 SRANDMEMBER 、 SSCAN ,可以参考:

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>
复制

总结

  1. SPOP 命令可以随机从集合中移除指定个数元素,并将这些元素返回。
  2. SRANDMEMBER 命令可以随机从集合中选取指定个数元素,并将这些元素返回,但是不改变集合本身。
  3. SSCAN 命令可以分段迭代整个集合,避免操作大集合造成卡顿。

2020-1-1 22:56:35

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论