美文网首页
redis命令之KEYS和SCAN

redis命令之KEYS和SCAN

作者: 我有一只喵喵 | 来源:发表于2020-07-12 11:48 被阅读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用于处理一个大的集合键时, 它们可能会阻塞服务器达数秒之久。

    综上:

    • 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

    https://redis.io/commands

    相关文章

      网友评论

          本文标题:redis命令之KEYS和SCAN

          本文链接:https://www.haomeiwen.com/subject/evsgcktx.html