redis集群模糊匹配key并批量删除

Redis中没有批量删除特定前缀key的指令,但我们往往需要根据前缀来删除。

在单机、缓存数据不多的情况下可以使用keys *命令查询匹配到的key,然后删除。

因为Redis的单线程服务模式,命令keys会阻塞正常的业务请求,如果你一次keys匹配的数量过多或者在del的时候遇到大key,都会直接导致业务的不可用,甚至造成redis宕机的风险。

所以我们在生产环境中应当避免使用keys命令,并且通常运维也会配置集群禁用keys命令。官方推荐使用scan命令。

SCAN介绍及使用

Redis从2.8版本开始支持scan命令,SCAN命令的基本用法如下:

SCAN cursor [MATCH pattern] [COUNT count]

  • cursor: 游标,SCAN命令是一个基于游标的迭代器,SCAN命令每次被调用之后,都会向用户返回一个新的游标,用户在下次迭代时需要使用这个新游标作为SCAN命令的游标参数,以此来延续之前的迭代过程,直到服务器向用户返回值为0的游标时,一次完整的遍历过程就结束了

  • MATCH: 匹配规则,例如遍历包含geo:info:A:B:的所有key可以写成*geo:info:A:B:*

  • COUNT: COUNT选项的作用就是让用户告知迭代命令,在每次迭代中应该从数据集里返回多少元素,COUNT只是对增量式迭代命令的一种提示,并不代表真正返回的数量,例如你COUNT设置为2有可能会返回3个元素,但返回的元素数据会与COUNT设置的正相关,COUNT的默认值是10

批量删除可以分为两步,首先通过SCAN查询到对应的key,然后再通过命令或者写代码批量删除。

模糊查询key

root@cebfd91e923a:/data# 
root@cebfd91e923a:/data#  redis-cli -c -h redis.XXXXXXX.cn -p 6379  -a mypassword
192.168.0.1:6379> 
192.168.0.1:6379> 
192.168.0.1:6379> keys * # 这是因为运维人员将Redis危险命令进行了禁用屏蔽
(error) ERR unknown command `keys`, with args beginning with: 
192.168.0.1:6379> 
192.168.0.1:6379>
192.168.0.1:6379> dbsize  #显示当前库key的数量
(integer) 277833
192.168.0.1:6379> 
192.168.0.1:6379>
192.168.0.1:6379> info keyspace  #可以看到所有库key的数量db0:keys=277831,expires=277815,avg_ttl=86202783
192.168.0.1:6379> 
192.168.0.1:6379>
192.168.0.1:6379> scan 0 MATCH AAAAAAAAAA*
1) "34566"      # 下一次查询的游标
2) (empty array)
192.168.0.1:6379> 
192.168.0.1:6379>
192.168.0.1:6379> scan 34566 MATCH AAAAAAAAAA*
1) "34566"      # 下一次查询的游标
2) (empty array)
192.168.0.1:6379> 
192.168.0.1:6379>
192.168.0.1:6379> scan 0 MATCH *geo:info:A:B:*
1) "463872"
2) 1) "or:doaj:geo:info:A:B:wm3zpcp:wm6p071"
192.168.0.1:6379> 
192.168.0.1:6379>
192.168.0.1:6379> scan 0 MATCH *geo:info:A:B:*  COUNT 10000  # 在每次迭代中应该从数据集里返回多少元素
1) "38656"
2) 1) "or:doaj:geo:info:A:B:wm3zpcp:wm6p071"
   2) "or:doaj:geo:info:A:B:wm3zpcn:wm6p068"
   3) "or:doaj:geo:info:A:B:wm3yzq7:wm3zpfu"
192.168.0.1:6379>
192.168.0.1:6379> scan 0 MATCH *geo:info:A:B:*  COUNT 1000000000
1) "0"
2) 1) "or:doaj:geo:info:A:B:wm3zpcp:wm6p071"
   2) "or:doaj:geo:info:A:B:wm3zpcn:wm6p068"
   3) "or:doaj:geo:info:A:B:wm3yzq7:wm3zpfu"
192.168.0.1:6379> 
192.168.0.1:6379> 

你可能感兴趣的:(Redis系列,redis,运维)