redis中各种scan命令学习

发布时间 2023-10-03 18:15:53作者: lypbendlf

转自:https://blog.csdn.net/qq_40399646/article/details/109034331,这个博客讲的非常好

http://jinguoxing.github.io/redis/2018/09/04/redis-scan/

1.介绍

keys命令可以列出所有满足特定正则字符串规则的 key。但它没有 offset、limit 参数,会一次性返回所有满足条件的 key,是遍历算法,复杂度是 O(n),如果实例中有千万级以上的 key,这个指令就会导致 Redis 服务卡顿。

所有有了scan命令:

  • 复杂度虽然也是 O(n),但是它是通过游标分步进行的,不会阻塞线程;有limit参数控制每次返回的数量,match提供模式匹配。

  • 返回的结果可能会有重复,需要客户端去重;服务器不需要为游标保存状态,客户端保存游标来确定是否结束or继续遍历,当游标为0时,迭代结束。
SCAN cursor [MATCH pattern] [COUNT count]   //cursor 无符号 64 位整数(游标)

 

full iteration :以 0 作为游标开始一次新的迭代, 一直调用 SCAN 命令, 直到命令返回游标 0 , 我们称这个过程为一次完整遍历。//有点疑问的是游标的返回值redis内部是怎么计算的?看起来怪怪的,不懂。

  • count:默认值为 10,在每次迭代中应该从数据集里返回多少元素。但不一定准,如果数据集比较小,那么可能会一次性返回所有符合条件的,并不按照count的值来。
  • MATCH:对元素的模式匹配工作是在命令从数据集中取出元素后和向客户端返回元素前的这段时间内进行的, 所以如果被迭代的数据集中只有少量元素和模式相匹配, 那么迭代命令或许会在多次执行中都不返回任何元素(但并不代表迭代结束了,只有游标返回0时才表示结束)。

 2.其他scan

  • SCAN 命令用于迭代当前数据库中的key集合。返回的每个元素都是一个key。
  • SSCAN 命令用于迭代SET集合中的元素。返回的每个元素都是一个集合成员
  • HSCAN 命令用于迭代Hash类型中的键值对。返回的每个元素都是一个键值对,一个键值对由一个键和一个值组成。
  • ZSCAN 命令用于迭代SortSet集合中的元素和元素对应的分值。返回的每个元素都是一个有序集合元素,一个有序集合元素由一个成员(member)和一个分值(score)组成。
redis 127.0.0.1:6379> scan 0   # 使用 0 作为游标,开始新的迭代
1) "17"                        # 第一次迭代时返回的游标
2)  1) "key:12"
    2) "key:8"
    3) "key:4"
    4) "key:14"


> SADD myset1 "Google" "Runoob" "Taobao"
(integer) 3
> SSCAN myset1 0 match R*
1) "0"
2) 1) "Runoob"


> HMSET sites google "google.com" runoob "runoob.com" weibo "weibo.com"
OK
> HSCAN sites 0 match "run*"
1) "0"
2) 1) "runoob"
2) "runoob.com"


> ZADD site 1 "Google" 2 "Runoob" 3 "Taobao" 4 "Weibo"
(integer) 4
> ZSCAN site 0 match "R*"
1) "0"
2) 1) "Runoob"
2) 2.0