在不影响性能的情况下,怎么快速批量删除redis数据?

 明霞学 发布于 2022-10-25 11:11

业务场景:
redis数据切换到Oracle,取消持久化,redis只做缓存

具体需求:
从redis从库里获得了400w个无过期时间的hashkey,需要在主库中将其删除

矛盾点:
1.如果直接批量删除会导致redis拥塞,影响正常业务
2.如果每删除一个key,sleep50ms,不会影响业务,但是根据经验要跑两天

最终问题:
在不影响性能的情况下,怎么快速批量删除redis数据?

4 个回答
  • $ redis-cli --scan --pattern 'user:*' | xargs -L 1000 redis-cli del

    starting with Redis 3.4:

    $ redis-cli --scan --pattern 'user:*' | xargs -L 1000 redis-cli unlink
    2022-10-26 23:19 回答
  • 小弟愚见,可半夜2点删一下,大概卡顿最长时间可能也就是1min吧,这个时间点应该不会有几个人用,除非是百度淘宝之类的24小时流量网站!不用感谢我,我叫雷锋

    2022-10-26 23:19 回答
  • 尝试下 redis 的 eval 命令。

    例如删除 old-fashioned: 开头的所有 KEY

    eval "redis.call('del', unpack(redis.call('keys','old-fashioned:*')))" 0
    

    如果单次删除性能消耗大,可以考虑分批删除。

    2022-10-26 23:19 回答
  • Redis删key删得飞快,400w也不在话下。我怀疑其实瓶颈在于网络。

    如果你是一个一个key删的,每次发送一个命令都会导致客户端等待redis的回复,浪费了大量网络带宽。

    可以试试用pipelining/transactions。在不饱和redis端网络带宽的前提下,以最大速度发送命令,然后一次执行。

    如果这都不行的话,可以写一个Lua脚本,识别并删除无用的key,发送到redis用eval执行。这样应该不会阻塞网络。

    如果这样还是影响业务的话。。终极解决方案是创建一个master/slave,在slave上删除key,而将请求用master处理。删完key之后把slave晋升成master,再将请求转向它。

    2022-10-26 23:19 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有