在不影响性能的情况下,怎么快速批量删除redis数据
1个回答
展开全部
业务场景: redis数据切换到Oracle,取消持久化,redis只做缓存
具体需求: 从redis从库里获得了400w个无过期时间的hashkey,需要在主库中将其删除
矛盾点:1.如果直接批量删除会导致redis拥塞,影响正常业务2.如果每删除一个key,sleep50ms,不会影响业务,但是根据经验要跑两天
最终问题: 在不影响性能的情况下,怎么快速批量删除redis数据?
Redis删key删得飞快,400w也不在话下。我怀疑其实瓶颈在于网络。
如果你是一个一个key删的,每次发送一个命令都会导致客户端等待redis的回复,浪费了大量网络带宽。
可以试试用pipelining/transactions。在不饱和redis端网络带宽的前提下,以最大速度发送命令,然后一次执行。
如果这都不行的话,可以写一个Lua脚本,识别并删除无用的key,发送到redis用eval执行。这样应该不会阻塞网络。
如果这样还是影响业务的话。。终极解决方案是创建一个master/slave,在slave上删除key,而将请求用master处理。删完key之后把slave晋升成master,再将请求转向它。
2014年07月24日回答
滕亦飞1.3k
尝试下 redis 的 eval 命令。
例如删除 old-fashioned: 开头的所有 KEY
eval "redis.call('del', unpack(redis.call('keys','old-fashioned:*')))" 0
如果单次删除性能消耗大,可以考虑分批删除。
具体需求: 从redis从库里获得了400w个无过期时间的hashkey,需要在主库中将其删除
矛盾点:1.如果直接批量删除会导致redis拥塞,影响正常业务2.如果每删除一个key,sleep50ms,不会影响业务,但是根据经验要跑两天
最终问题: 在不影响性能的情况下,怎么快速批量删除redis数据?
Redis删key删得飞快,400w也不在话下。我怀疑其实瓶颈在于网络。
如果你是一个一个key删的,每次发送一个命令都会导致客户端等待redis的回复,浪费了大量网络带宽。
可以试试用pipelining/transactions。在不饱和redis端网络带宽的前提下,以最大速度发送命令,然后一次执行。
如果这都不行的话,可以写一个Lua脚本,识别并删除无用的key,发送到redis用eval执行。这样应该不会阻塞网络。
如果这样还是影响业务的话。。终极解决方案是创建一个master/slave,在slave上删除key,而将请求用master处理。删完key之后把slave晋升成master,再将请求转向它。
2014年07月24日回答
滕亦飞1.3k
尝试下 redis 的 eval 命令。
例如删除 old-fashioned: 开头的所有 KEY
eval "redis.call('del', unpack(redis.call('keys','old-fashioned:*')))" 0
如果单次删除性能消耗大,可以考虑分批删除。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
今至电子科技有限公司
2024-08-23 广告
2024-08-23 广告
上海今至电子科技有限公司,是一家从事运维服务、系统集成和网络工程的专业公司。业务涵盖IT解决方案、网络工程、应用软件开发、系统集成、服务器虚拟化、桌面虚拟化、高性能运算、负载均衡、数据容灾备份、服务外包、IT运维等。我们的理念:诚信为本,服...
点击进入详情页
本回答由今至电子科技有限公司提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |