從Redis中刪除大集合物件的方法

輕架構發表於2019-01-10

Redis中的大集合物件,如set、zset等,如果有上千萬個元素,一般是不能直接用del命令來刪除的,因為del命令可能會耗時幾秒鐘,而redis本身是單執行緒的,在高併發的情況下會阻塞大量的請求,嚴重時可能引起雪崩。

那我們要怎麼來刪除它呢?

這裡我們給出一個解決方案,即結合lua指令碼來實現刪除大物件。

先寫如下lua指令碼,儲存為test_del.lua檔案。

<<test_del.lua>>

local count=redis.call(`zcard`, `big_obj_key`)

while count>0 do

        redis.call(`zremrangebyrank`, ` big_obj_key`, 0, 500)  // 每次刪除500個元素

        count=redis.call(`zcard`, ` big_obj_key`)

        print(“Current count: “, count)

end

最後,在命令列使用如下命令執行該lua指令碼即可。

bin/redis-cli -p 6370  -a  yourpasswd  –eval   /usr/local/redis/lua/test_del.lua

是不是很方便啊?

 

相關文章