搜尋

首頁  >  問答  >  主體

在不影響效能的情況下,怎麼快速批次刪除redis資料?

業務場景:
redis數據切換到Oracle,取消持久化,redis隻做緩存

具體需求:
從redis從庫裏獲得了400w個無過期時間的hashkey,需要在主庫中將其刪除

矛盾點:
1.如果直接批量刪除會導致redis擁塞,影響正常業務
2.如果每刪除一個key,sleep50ms,不會影響業務,但是根據經驗要跑兩天

最終問題:
在不影響性能的情況下,怎麼快速批量刪除redis數據?

黄舟黄舟2798 天前792

全部回覆(4)我來回復

  • 天蓬老师

    天蓬老师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,再將請求轉向它。

    回覆
    0
  • 迷茫

    迷茫2017-04-21 11:17:52

    嘗試下 redis 的 eval 指令。

    例如刪除 old-fashioned: 開頭的所有 KEY

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

    如果單次刪除效能消耗大,可以考慮分批刪除。

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-21 11:17:52

    小弟愚見,可半夜2點刪一下,大概卡頓最長時間可能也就是1min吧,這個時間點應該不會有幾個人用,除非是百度淘寶之類的24小時流量網站!不用感謝我,我叫雷鋒

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-21 11:17:52

    雷雷

    從 Redis 3.4 開始:

    雷雷

    回覆
    0
  • 取消回覆