redis命令之KEYS和SCAN

2020-07-12  本文已影响0人  我有一只喵喵

一、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用于处理一个大的集合键时, 它们可能会阻塞服务器达数秒之久。

综上:

四、参考文档

http://doc.redisfans.com/key/scan.html
http://doc.redisfans.com/key/keys.html#keys
https://blog.csdn.net/zanpengfei/article/details/83691841

https://redis.io/commands

上一篇下一篇

猜你喜欢

热点阅读