Redis算法-scan
- Redis算法
- 数据快速查询算法
- scan
Scan
如何从海量的key中找出满足特定前缀的key列表?
keys *
: 获取全部keykeys sth*
: 获取前缀为sth的keykeys sth*sth
: 获取前缀和后缀为sth的key- 缺点:
1. 没有offset、limit参数
2. 复杂度为O(n)
scan的特点
- 复杂度虽然也是O(n),但它是通过游标分步进行的,不会堵塞线程。
- 提供limit参数,可以控制每次返回结果的最大条数
- 同keys一样,它也提供模式匹配功能。
- 服务器不需要为游标保存状态,游标唯一状态就是scan返回给客户端的游标整数。
- 返回的数据可能会有重复,需要客户端去重
- 遍历过程中如果有数据修改,改动后的数据能不能遍历是不确定的。
- 单次返回的结果是空的并不意味着遍历结束,而要看返回的游标值是否为零。
基本用法
- scan提供三个参数
- cursor: 游标位置,第一次遍历时cursor为0,然后将返回的游标作为下一次遍历的cursor,一直到返回的cursor为0
- key正则表模式
- 遍历的limit hint: 一次遍历多少次
- Demo
script 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23127.0.0.1:6379> scan 0 match key999* count 3000
1) "1746"
2) 1) "key9996"
2) "key999"
3) "key9990"
127.0.0.1:6379> scan 1746 match key999* count 3000
1) "9753"
2) 1) "key9997"
2) "key9999"
3) "key9991"
127.0.0.1:6379> scan 9753 match key999* count 3000
1) "5223"
2) 1) "key9995"
2) "key9998"
3) "key9994"
4) "key9992"
127.0.0.1:6379> scan 5223 match key999* count 3000
1) "0"
2) 1) "key9993" - 更多scan命令
zscan
遍历zset集合元素hscan
遍历hash字典元素sscan
遍历set集合元素
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 yanglau0527@gmail.com
文章标题:Redis算法-scan
文章字数:423
本文作者:Cynaith
发布时间:2020-05-02, 02:41:40
最后更新:2020-05-02, 02:43:00
原始链接:https://cynaith.github.io/2020/05/02/Redis%E7%AE%97%E6%B3%95-scan/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。