【redis】遍历键

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并不能保证完整的遍历出所有的键。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值