Redis中的大集合對象,如set、zset等,如果有上千萬個元素,一般是不能直接用del命令來刪除的,因為del命令可能會耗時幾秒鐘,而redis本身是單線程的,在高併發的情況下會阻塞大量的請求,嚴重時可能引起雪崩。 那我們要怎麼來刪除它呢? 這裡我們給出一個解決方案,即結合lua腳本來實現刪除大 ...
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
是不是很方便啊?