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"
3 del命令(生产环境禁用)
> keys "xxx*" | xargs del
批量删除以xxx开头的全部key的缓存,不在生产环境使用。