zoukankan      html  css  js  c++  java
  • redis的keys命令与scan命令

    1 keys命令

    可以使用正则查找匹配的结果。时间复杂度是O(N),N为redis中所有key的总数量。

    该命令有致命的缺点:

    a. 没有limit,只能一次性获取所有符合条件的key。如果数据量很大的话,就会产生无穷无尽的输出。

    b. keys命令是遍历算法,遍历全部的key,时间复杂度是O(N)。redis是单线程的,如果keys查询的时间过长,redis的其它操作会被阻塞较长时间,造成redis较长时间的卡顿。要避免在生产环境使用该命令。

    命令格式:keys pattern

    2 scan命令

    命令格式:scan cursor match pattern count num

    redis2.8版本之后,可以使用scan命令进行正则匹配查找。与keys不同的是,scan命令不是一次性查找出所有满足条件的key。而是根据游标和遍历的字典槽数,使得每次查询都限制在一定范围内。

    cursor = 0时表示开始查询,第一次查询。每次查询结果中都会返回一个cursor,作为下次查询的开始游标。当某次查询返回的cursor=0时,表示已全部查询完毕。

    举例:scan 命令查找模式匹配 user_info:*的key,每次查询返回的1)是下次查询开始的游标,2)是本次查询匹配的结果。可以看出,第3次查询返回的游标为0,表示全部查询完毕。

    count值设置为多少合适呢?

    其实设置多少都可以,scan就是迭代查询,多次迭代总可以遍历完。但是如果设置的太大,超过总的key的数量,就相当于一次全部查询出来啦,同keys没啥区别啦。

    localhost:6379> scan 0 match user_info:* count 10000
    1) "6630"
    2) 1) "user_info:web:82"
       2) "user_info:web:2020"
       3) "user_info:2014"
       4) "user_info:web:1747"
       5) "user_info:3703"
       6) "user_info:1777"
       7) "user_info:142"
    localhost:6379> scan 6630 match user_info:* count 10000
    1) "651"
    2)  1) "user_info:1922"
        2) "user_info:web:1922"
        3) "user_info:web:1777"
        4) "user_info:web:142"
        5) "user_info:web:1921"
        6) "user_info:web:2024"
        7) "user_info:web:1676"
        8) "user_info:2020"
        9) "user_info:web:2023"
       10) "user_info:1774"
    localhost:6379> scan 651 match user_info:* count 10000
    1) "0"
    2) 1) "user_info:web:2037"
       2) "user_info:web:344"
  • 相关阅读:
    SQL进程死锁排查
    SQL 日期转换
    SQL Server 删除日志文件
    SQL 修复表
    charindex函数--->检索字符在字符串中的起始位置
    SQL使用链接服务器执行远程数据库上的存储过程
    C# 学习第二天笔记
    C# 学习笔记第一天
    SQL Prompt 5 功能按键说明
    自定义排序(Icompare)
  • 原文地址:https://www.cnblogs.com/mydesky2012/p/11733089.html
Copyright © 2011-2022 走看看