redis-scan命令
介绍&场景
redis中找到以某某开头的key对这些key进行操作。
问题
使用keys的问题是,会拿出所有的对应的keys。
这样不仅仅你会发现满屏幕的key停不下来,因为redis是单线程的这个操作会影响其他的命令,其他命令很可能就超时了。
keys 使用方法
127.0.0.1:6379> SET n1 aa
OK
127.0.0.1:6379> SET n2 aa
OK
127.0.0.1:6379> SET n3 aa
OK
127.0.0.1:6379> SET n4 aa
OK
127.0.0.1:6379> keys n*
1) "name"
2) "n"
3) "name2"
4) "nk"
5) "n2"
6) "n3"
7) "n4"
8) "ning"
9) "name1"
10) "nn"
11) "n1"
127.0.0.1:6379>
scan 大海捞针 (>=redis 2.8)
scan cursor [MATCH pattern] [COUNT count]
match: 表示正则
count:指定扫描的槽数量
cursor:槽的游标(index),初始为0,结束也是0
案例
127.0.0.1:6379> scan 0 match a* count 2
1) "81920"
2) 1) "aaaaa54588"
2) "aaaaa15117"
127.0.0.1:6379> scan 0 match a* count 3
1) "114688"
2) 1) "aaaaa54588"
2) "aaaaa15117"
3) "aaaaa79701"
4) "aaaaa6832"
5) "aaaaa1417"
6) "aaaaa57847"
127.0.0.1:6379>
可以发现返回结果跟limit没有直接关系
limit是限制服务器扫描字典的槽数量(约等于)
槽是啥
槽就是字典的hash结构中的第一层数组结构中的index。
为什么返回的数量不确定
因为扫描槽(index)的时候,有的槽是空的,或者有的槽下面挂着很多元素,那就出现少于limit和多于limit这种情况。
scan扫描的顺序
高位进位加法来遍历,保证各种情况都能遍历到(详情自己百度吧 我是没看懂,也不想看。)
如果定位大key
- 写个脚本 scan+size两个操作进行判断
- redis-cli -h 127.0.0.1 -p 7001 –-bigkeys -i 0.1 redis-cli支持扫描
网友评论