加入收藏 | 设为首页 | 会员中心 | 我要投稿 阜阳站长网 (https://www.0558zz.cn/)- AI行业应用、低代码、混合云存储、数据仓库、物联网!
当前位置: 首页 > 站长资讯 > 动态 > 正文

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

发布时间:2021-03-24 15:54:49 所属栏目:动态 来源:互联网
导读:s keys 来匹配你需要删除的key,再使用 xargs 把结果传给 redis-cli del ,这样看似完美,实则有很大风险。 上面命令使用非常简单,提供一个简单的正则字符串即可,但是有很明显的两个缺点。 没有 offset、limit 参数,一次性吐出所有满足条件的 key,万一实

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

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

  • 没有 offset、limit 参数,一次性吐出所有满足条件的 key,万一实例中有几百 w 个 key 满足条件,当你看到满屏的字符串刷的没有尽头时,你就知道难受了。
  • keys 算法是遍历算法,复杂度是 O(n),如果实例中有千万级以上的 key,这个指令就会导致 Redis 服务卡顿,所有读写 Redis 的其它的指令都会被延后甚至会超时报错,因为 Redis 6 版本以下都是单线程程序,顺序执行所有指令,其它指令必须等到当前的 keys 指令执行完了才可以继续,这样就会导致业务不可用,甚至造成redis宕机的风险。

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

解决方法二

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

  • ursor:游标,SCAN命令是一个基于游标的迭代器,SCAN命令每次被调用之后,都会向用户返回一个新的游标,用户在下次迭代时需要使用这个新游标作为SCAN命令的游标参数,以此来延续之前的迭代过程,直到服务器向用户返回值为0的游标时,一次完整的遍历过程就结束了。
  • MATCH:匹配规则,例如遍历以 testkey- 开头的所有key可以写成 testkey-*。
  • COUNT:COUNT选项的作用就是让用户告知迭代命令,在每次迭代中应该从数据集里返回多少元素,COUNT只是对增量式迭代命令的一种提示,并不代表真正返回的数量,例如你COUNT设置为2有可能会返回3个元素,但返回的元素数据会与COUNT设置的正相关,COUNT的默认值是10。

(编辑:阜阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读