Script Lua berikut menggunakan SCAN
perintah, sehingga menghapus sebagian dalam skrip - menghindari kesalahan "terlalu banyak elemen untuk dibongkar".
local cursor = 0
local calls = 0
local dels = 0
repeat
local result = redis.call('SCAN', cursor, 'MATCH', ARGV[1])
calls = calls + 1
for _,key in ipairs(result[2]) do
redis.call('DEL', key)
dels = dels + 1
end
cursor = tonumber(result[1])
until cursor == 0
return "Calls " .. calls .. " Dels " .. dels
Ini mengembalikan berapa kali SCAN
dipanggil dan berapa banyak kunci yang dihapus.
Gunakan sebagai:
EVAL "local cursor = 0 local calls = 0 local dels = 0 repeat local result = redis.call('SCAN', cursor, 'MATCH', ARGV[1]) calls = calls + 1 for _,key in ipairs(result[2]) do redis.call('DEL', key) dels = dels + 1 end cursor = tonumber(result[1]) until cursor == 0 return 'Calls ' .. calls .. ' Dels ' .. dels" 0 prefix:1
Perhatikan itu akan memblokir server saat berjalan, jadi tidak disarankan untuk produksi apa adanya.
Untuk produksi, pertimbangkan untuk mengubah DEL
untuk UNLINK
. Anda juga dapat mengembalikan kursor (alih-alih mengulangi di dalam skrip hingga nol) dan menambahkan parameter COUNT ke SCAN untuk mencekik (lihat Apakah ada nilai COUNT yang direkomendasikan untuk perintah SCAN / HSCAN di REDIS?). Dengan cara ini Anda melakukannya dalam potongan alih-alih sekali jalan, mirip dengan Bagaimana saya bisa mendapatkan semua set dalam redis?
Atau Anda dapat melakukan sesuatu yang lebih canggih menggunakan pendekatan yang dinyatakan dalam jawaban ini:Redis `SCAN`:bagaimana menjaga keseimbangan antara kunci baru yang mungkin cocok dan memastikan hasil akhirnya dalam waktu yang wajar?