業務場景:
redis數據切換到Oracle,取消持久化,redis隻做緩存
具體需求:
從redis從庫裏獲得了400w個無過期時間的hashkey,需要在主庫中將其刪除
矛盾點:
1.如果直接批量刪除會導致redis擁塞,影響正常業務
2.如果每刪除一個key,sleep50ms,不會影響業務,但是根據經驗要跑兩天
最終問題:
在不影響性能的情況下,怎麼快速批量刪除redis數據?
天蓬老师2017-04-21 11:17:52
Redis刪key刪得飛快,400w也不在話下。我懷疑其實瓶頸在於網路。
如果你是一個key刪的,每次發送一個命令都會導致客戶端等待redis的回复,浪費了大量網路頻寬。
可以試試用pipelining/transactions。在不飽和redis端網路頻寬的前提下,以最大速度發送命令,然後一次執行。
如果這都不行的話,可以寫一個Lua腳本,識別並刪除無用的key,發送到redis用eval執行。這樣應該不會阻塞網路。
如果這樣還是影響業務的話。 。終極解決方案是建立一個master/slave,在slave上刪除key,而將請求用master處理。刪完key之後把slave升遷成master,再將請求轉向它。
迷茫2017-04-21 11:17:52
嘗試下 redis 的 eval 指令。
例如刪除 old-fashioned: 開頭的所有 KEY
eval "redis.call('del', unpack(redis.call('keys','old-fashioned:*')))" 0
如果單次刪除效能消耗大,可以考慮分批刪除。
伊谢尔伦2017-04-21 11:17:52
小弟愚見,可半夜2點刪一下,大概卡頓最長時間可能也就是1min吧,這個時間點應該不會有幾個人用,除非是百度淘寶之類的24小時流量網站!不用感謝我,我叫雷鋒