文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Redis如何删除数量过万以上Key而不影响业务

2024-12-03 08:37

关注

解决方法一

一般通过网上搜索,会告诉你使用下面方法,Redis 提供了一个简单暴力的指令 keys用来列出所有满足特定正则字符串规则的 key。

  1. $ redis-cli --raw keys "testkey-*" | xargs redis-cli del 

通过 Redis keys 来匹配你需要删除的key,再使用 xargs 把结果传给 redis-cli del ,这样看似完美,实则有很大风险。

上面命令使用非常简单,提供一个简单的正则字符串即可,但是有很明显的两个缺点。

注意:这种方法不推荐,建议生产环境屏蔽keys命令。那大家会问,有没有更好的方法来解决这个问题?答案是当然用,请接着看下文。

解决方法二

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

  1. SCAN cursor [MATCH pattern] [COUNT count

例子:

  1. $ scan 0 MATCH testkey-* 
  2.  
  3. 1) "34" 
  4. 2)  1) "testkey-2" 
  5.     2) "testkey-49" 
  6.     3) "testkey-20" 
  7.     4) "testkey-19" 
  8.     5) "testkey-93" 
  9.     6) "testkey-8" 
  10.     7) "testkey-34" 
  11.     8) "testkey-76" 
  12.     9) "testkey-13" 
  13.    10) "testkey-18" 
  14.    11) "testkey-10" 
  15.  
  16. $ scan 34 MATCH testkey-* COUNT 1000 
  17.  
  18. 1) "0" 
  19. 2)  1) "ops-coffee-16" 
  20.     2) "ops-coffee-19" 
  21.     3) "ops-coffee-23" 
  22.     4) "ops-coffee-21" 
  23.     5) "ops-coffee-40" 
  24.     6) "ops-coffee-22" 
  25.     7) "ops-coffee-1" 
  26.     8) "ops-coffee-11" 
  27.     9) "ops-coffee-28" 
  28.    10) "ops-coffee-3" 
  29.    11) "ops-coffee-26" 
  30.    12) "ops-coffee-4" 
  31.    13) "ops-coffee-31" 
  32.    ... 

scan 命令返回的是一个包含两个元素的数组,第一个数组元素是用于进行下一次迭代的新游标,而第二个数组元素则是一个数组,这个数组中包含了所有被迭代的元素。

上面这个例子的意思是扫描所有前缀为testkey-的key。第一次迭代使用0作为游标,表示开始一次新的迭代,同时使用了MATCH匹配前缀为testkey-的key,返回了游标值34以及遍历到的数据。第二次迭代使用的是第一次迭代时返回的游标,也即是命令回复第一个元素的值34,同时通过将COUNT选项的参数设置为1000,强制命令为本次迭代扫描更多元素。在第二次调用SCAN命令时,命令返回了游标0,这表示迭代已经结束,整个数据集已经被完整遍历过了。

Redis scan 命令就是基于游标的迭代器,意味着命令每次被调用都需要使用上一次这个调用返回的游标作为该次调用的游标参数,以此来延续之前的迭代过程。当SCAN命令的游标参数被设置为0时,服务器将开始一次新的迭代,而当redis服务器向用户返回值为0的游标时,表示迭代已结束,这是唯一迭代结束的判定方式,而不能通过返回结果集是否为空判断迭代结束。

上面的需求,最终可以使用下面命令来解决:

  1. $ redis-cli --scan --pattern "testkey-*" | xargs -L 1000 redis-cli del 

xargs -L 指令表示xargs一次读取的行数,也就是每次删除key的数量,不要一次行读取太多数量key。

scan 与 keys 比较

scan 相比 keys 具备有以下特点:

小结

Redis 类似 scan 命令还有很多,比如:

注意:SSCAN 命令、 HSCAN 命令和 ZSCAN 命令的第一个参数总是一个数据库键。而 SCAN 命令则不需要在第一个参数提供任何数据库键,因为它迭代的是当前数据库中的所有数据库键。

参考链接

http://jinguoxing.github.io/redis/2018/09/04/redis-scan/

https://juejin.cn/post/6844903869412016142

 

来源:YP小站内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯