1.全量遍历
192.168.1.7:6380> keys *
1) "python"
2) "java"
3) "user:ranking:20240619"
4) "hashkey1"
keys pattern
*:代表配任意字符
?:代表匹配任意一个字符。
[]:大表匹配部分字符。[1,3],匹配1和3;[1-10]匹配1到10的任意数字。
\x:用来做转义,例如要匹配星号,问号需要进行转义。
192.168.1.7:6379> keys *
1) "redis"
2) "hill"
3) "jedis"
4) "hello"
192.168.1.7:6379> keys [j,r]edis
1) "redis"
2) "jedis"
192.168.1.7:6379> keys h?ll*
1) "hill"
2) "hello"
--删除video字符串开头的键。
redis-cli keys video* |xargs redis-cli del
可以在以下三种情况下使用keys*
在一个不对外提供服务的redis节点上执行,这样不会阻塞到客户端的请求,但是
会影响到主从复制。
如果确认键值总数确实比较少,可以执行次命令。
使用scan命令渐进式遍历所有键,可以有效防止阻塞。
2.渐进式遍历键。
redis从2.8版本后,提供了一个新的命令scan,它能有效的解决keys命令存在的问题。
和keys命令执行时会遍历所有键不同,scan采用渐进式遍历的方式来解决keys
的功能,需要执行多次scan.redis存储键值对使用的是hashtable的数据结构
scan cursor [match pattern] [count number]
cursor:是必须参数,实际上cursor是一个游标,第一次遍历从0开始,每次scan
遍历完都会返回当前游标的值,直到游标值为0,表示遍历结束。
match pattern:是可选参数,它的作用时做模式的匹配,这点和keys的模式匹配很像。
count number:是可选的,它的作用是表名要遍历的键个数,默认值是10,此参数可以适当增加。
192.168.1.7:6379> scan 0
1) "14"
2) 1) "s"
2) "i"
3) "b"
4) "n"
5) "e"
6) "hill"
7) "m"
8) "x"
9) "y"
10) "jedis"
192.168.1.7:6379> scan 14
1) "13"
2) 1) "hello"
2) "c"
3) "j"
4) "t"
5) "k"
6) "z"
7) "redis"
8) "f"
9) "l"
10) "o"
11) "d"
192.168.1.7:6379> scan 13
1) "0"
2) 1) "r"
2) "p"
3) "q"
4) "g"
5) "w"
6) "v"
7) "a"
8) "u"
9) "h"
返回的第一行是下次scan指定的游标数。变为0表示遍历结束。
除了scan以外,redis提供了面向哈希类型,集合类型,有序集合的扫描变量命令。
解决诸如 hgetall,smembers ,zrange 可能产生的阻塞问题。
对应的命令分别是:hscan,sscan,zscan,他们的用法和scan类似。
渐进式遍历可以有效解决keys命令可能产生的阻塞问题,但是scan并非完美无瑕。
如果在scan的过程中如果有键的变化(增加,删除,修改),那么遍历效果可能会
碰到:新增的键可能没有遍历到,遍历出了重复的键等情况,也就是说
scan并不能保证完整的遍历出所有的键。