84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
业务场景: 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,再将请求转向它。
尝试下 redis 的 eval 命令。
例如删除 old-fashioned: 开头的所有 KEY
eval "redis.call('del', unpack(redis.call('keys','old-fashioned:*')))" 0
如果单次删除性能消耗大,可以考虑分批删除。
小弟愚见,可半夜2点删一下,大概卡顿最长时间可能也就是1min吧,这个时间点应该不会有几个人用,除非是百度淘宝之类的24小时流量网站!不用感谢我,我叫雷锋
$ 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
Redis删key删得飞快,400w也不在话下。我怀疑其实瓶颈在于网络。
如果你是一个一个key删的,每次发送一个命令都会导致客户端等待redis的回复,浪费了大量网络带宽。
可以试试用pipelining/transactions。在不饱和redis端网络带宽的前提下,以最大速度发送命令,然后一次执行。
如果这都不行的话,可以写一个Lua脚本,识别并删除无用的key,发送到redis用eval执行。这样应该不会阻塞网络。
如果这样还是影响业务的话。。终极解决方案是创建一个master/slave,在slave上删除key,而将请求用master处理。删完key之后把slave晋升成master,再将请求转向它。
尝试下 redis 的 eval 命令。
例如删除 old-fashioned: 开头的所有 KEY
如果单次删除性能消耗大,可以考虑分批删除。
小弟愚见,可半夜2点删一下,大概卡顿最长时间可能也就是1min吧,这个时间点应该不会有几个人用,除非是百度淘宝之类的24小时流量网站!不用感谢我,我叫雷锋
starting with Redis 3.4: