redisscan优雅的批量删除
Redis删除特定前缀key的优雅实现
还在⽤keys命令模糊匹配删除数据吗?这就是⼀颗随时爆炸的!
Redis中没有批量删除特定前缀key的指令,但我们往往需要根据前缀来删除,那么究竟该怎么做呢?可能你⼀通搜索后会得到下边的答案
redis-cli --raw keys "ops-coffee-*" | xargs redis-cli del
直接在linux下通过redis的keys命令匹配到所有的key,然后调⽤系统命令xargs来删除,看似⾮常完美,实则风险巨⼤
因为Redis的单线程服务模式,命令keys会阻塞正常的业务请求,如果你⼀次keys匹配的数量过多或者在del的时候遇到⼤key,都会直接导致业务的不可⽤,甚⾄造成redis宕机的风险
所以我们在⽣产环境中应当避免使⽤上边的⽅法,那有什么优雅的⽅法来解决呢?SCAN!
SCAN介绍及使⽤
Redis从2.8版本开始⽀持scan命令,SCAN命令的基本⽤法如下:
SCAN cursor [MATCH pattern] [COUNT count]
cursor: 游标,SCAN命令是⼀个基于游标的迭代器,SCAN命令每次被调⽤之后,都会向⽤户返回⼀个新的游标,⽤户在下次迭代时需要使⽤这个新游标作为SCAN命令的游标参数,以此来延续之前的迭代过程,直到服务器向⽤户返回值为0的游标时,⼀次完整的遍历过程就结束了
MATCH: 匹配规则,例如遍历以ops-coffee-开头的所有key可以写成ops-coffee-,中间包含-coffee-的可以写成-coffee-*
COUNT: COUNT选项的作⽤就是让⽤户告知迭代命令,在每次迭代中应该从数据集⾥返回多少元素,COUNT只是对增量式迭代命令的⼀种提⽰,并不代表真正返回的数量,例如你COUNT设置为2有可能会返回3个元素,但返回的元素数据会与COUNT设置的正相关,COUNT的默认值是10
以下是⼀个SCAN命令的迭代过程⽰例:
127.0.0.1:6379> scan 0 MATCH ops-coffee-*
1. "38"
redis五种数据结构2.
1. "ops-coffee-25"
2. "ops-coffee-19"
3. "ops-coffee-29"
4. "ops-coffee-10"
5. "ops-coffee-23"
6. "ops-coffee-5"
7. "ops-coffee-14"
8. "ops-coffee-16"
9. "ops-coffee-11"
3. "ops-coffee-15"
4. "ops-coffee-7"
5. "ops-coffee-1"
127.0.0.1:6379> scan 38 MATCH ops-coffee-* COUNT 1000
6. "0"
7.
1. "ops-coffee-13"
2. "ops-coffee-9"
3. "ops-coffee-21"
4. "ops-coffee-6"
5. "ops-coffee-30"
6. "ops-coffee-20"
7. "ops-coffee-2"
8. "ops-coffee-12"
9. "ops-coffee-28"
8. "ops-coffee-3"
9. "ops-coffee-26"
10. "ops-coffee-4"
11. "ops-coffee-31"
12. "ops-coffee-8"
13. "ops-coffee-22"
14. "ops-coffee-27"
15. "ops-coffee-18"
16. "ops-coffee-24"
17. "ops-coffee-17"
SCAN命令返回的是⼀个包含两个元素的数组,第⼀个数组元素是⽤于进⾏下⼀次迭代的新游标,⽽第⼆个数组元素则是⼀个数组,这个数组中包含了所有被迭代的元素
上⾯这个例⼦的意思是扫描所有前缀为ops-coffee-的key
第⼀次迭代使⽤0作为游标,表⽰开始⼀次新的迭代,同时使⽤了MATCH匹配前缀为ops-coffee-的key,返回了游标值38以及遍历到的数据
第⼆次迭代使⽤的是第⼀次迭代时返回的游标,也即是命令回复第⼀个元素的值38,同时通过将COUNT选项的参数设置为1000,强制命令为本次迭代扫描更多元素
在第⼆次调⽤SCAN命令时,命令返回了游标0,这表⽰迭代已经结束,整个数据集已经被完整遍历过了
KEYS命令的时间复杂度为O(n),⽽SCAN命令会将遍历操作分解成m次时间复杂度为O(1)的操作来执⾏,从⽽解决使⽤keys命令遍历⼤量数据⽽导致服务器阻塞的情况,使⽤下边的指令可以达到优雅删除的⽬的:
redis-cli --scan --pattern "ops-coffee-*" | xargs -L 2000 redis-cli del
其中xargs -L指令表⽰xargs⼀次读取的⾏数,也就是每次删除的key数量,⼀次读取太多xargs会报错
其他⼏种数据结构的优雅删除
类似的SCAN命令,对于Redis不同的数据类型还有另外⼏个SSCAN、HSCAN和ZSCAN,使⽤⽅法类似:
sscan ops-coffee 0 MATCH v1*
1. "7"
2.
1. "v15"
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论