一、KEYS命令
作用:
用于查找所有符合给定模式 pattern 的 key
用法:
keys pattern
其中pattern符合正则语法
示例:
# 列出所有key
keys *
# 列出所有以name开头的keys
keys name*
# 列出所有以name结尾的keys
keys *name
更多用法见https://redis.io/commands/keys
二、SCAN命令
作用:
用于迭代当前数据库中的数据库键。与SCAN相关的命令还有各种数据类型对应的SCAN命令,如SSCAN、HSCAN等
SCAN命令类似于迭代器,每次调用之后,会返回给用户新的游标,用户下次迭代只需要使用返回的新游标作为游标参数,延续迭代过程。
用法:
SCAN cursor [MATCH pattern] [COUNT count]
若选择了可选参数 MATCH XXX ,则按照正则返回匹配的keys
若选择了可选参数COUNT XXX,则设置每次迭代返回的数量,默认为10
示例:
127.0.0.1:6379> scan 0
1) "11"
2) 1) "mylist:{tag}"
2) "set1"
3) "hashmap"
4) "key:{tag}:__rand_int__"
5) "key"
6) "set2"
7) "set"
8) "myhash:{tag}:__rand_int__"
9) "a"
10) "counter:{tag}:__rand_int__"
127.0.0.1:6379>
返回结果为包含两个元素的数组,第一个元素代表着迭代的当前位置。
更多用法见https://redis.io/commands/scan
注意点:
1.当redis字典进行缩容时还是可能会有些重复元素出现,即scan命令返回的keys可能有重复键
关于为什么会重复请看这篇文章深入理解Redis的scan命令
2.scan命令甚至可能会返回零个元素, 但只要命令返回的游标不是 0 , 应用程序就不应该将迭代视作结束
三、KEYS和SCAN命令优缺点比较
1)KEYS 的算法采用O(N)复杂度的遍历算法,没有limit限制,一次性遍历所有key,属于暴力搜索。假如redis服务器存在千万级别的key数量,但是又由于redis为单线程,那么如果执行keys命令,将会造成卡顿,一段时间内无法处理其他命令,造成其他客户端阻塞。所以生产环境不可以使用。
2)SCAN命令支持增量式迭代, 它们每次执行都只会返回少量元素, 所以这些命令可以用于生产环境, 而不会出现像KEYS 命令、 SMEMBERS命令带来的问题 —— 当 KEYS命令被用于处理一个大的数据库时, 又或者 SMEMBERS用于处理一个大的集合键时, 它们可能会阻塞服务器达数秒之久。
综上:
-
keys可一次性返回我们想要的所有key,但是若key的数量级比较大会造成阻塞
-
scan可分次返回匹配的key,不会造成阻塞,但是返回的key可能有重复,客户端需要根据需要进行去重
四、参考文档
http://doc.redisfans.com/key/scan.html
http://doc.redisfans.com/key/keys.html#keys
https://blog.csdn.net/zanpengfei/article/details/83691841
网友评论