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"