84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
业务场景: 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 3.4 開始:
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小時流量網站!不用感謝我,我叫雷鋒
雷雷
從 Redis 3.4 開始:
雷雷