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
是不是很方便啊?