Tập lệnh Lua sau sử dụng SCAN
, vì vậy nó sẽ xóa từng phần trong tập lệnh - tránh lỗi "quá nhiều phần tử để giải nén".
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
Nó trả về số lần SCAN
đã được gọi và bao nhiêu khóa đã bị xóa.
Sử dụng như:
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
Lưu ý rằng nó sẽ chặn máy chủ khi đang chạy, vì vậy nó không được khuyên dùng cho sản xuất như hiện nay.
Đối với quá trình sản xuất, hãy xem xét việc thay đổi DEL
cho UNLINK
. Bạn cũng có thể trả về con trỏ (thay vì lặp lại bên trong tập lệnh cho đến khi nó bằng 0) và thêm tham số COUNT vào SCAN để tiết lưu (xem Có giá trị khuyến nghị nào của COUNT cho lệnh SCAN / HSCAN trong REDIS không?). Theo cách này, bạn thực hiện theo nhiều phần thay vì một lượt, tương tự như Làm cách nào để tôi có được tất cả các bộ trong redis?
Hoặc bạn có thể làm điều gì đó phức tạp hơn bằng cách sử dụng phương pháp được nêu trong câu trả lời này:Redis `SCAN`:làm thế nào để duy trì sự cân bằng giữa các khóa mới có thể khớp và đảm bảo kết quả cuối cùng trong một thời gian hợp lý?