Het volgende Lua-script gebruikt SCAN
commando, dus het wordt in brokken verwijderd in het script - waarbij de fout "te veel elementen om uit te pakken" wordt vermeden.
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
Het geeft terug hoe vaak SCAN
is gebeld en hoeveel sleutels zijn verwijderd.
Gebruiken als:
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
Merk op dat het de server blokkeert tijdens het draaien, dus het wordt niet aanbevolen voor productie zoals het is.
Overweeg voor productie om DEL
. te wijzigen voor UNLINK
. U kunt ook de cursor retourneren (in plaats van herhalen in het script totdat deze nul is) en de parameter COUNT toevoegen aan SCAN om te vertragen (zie Is er een aanbevolen waarde van COUNT voor SCAN / HSCAN-opdracht in REDIS?). Op deze manier doe je het in brokken in plaats van in één keer, vergelijkbaar met Hoe krijg ik alle sets in redis?
Of u kunt iets geavanceerder doen met behulp van de benadering die in dit antwoord wordt vermeld:Redis `SCAN`:hoe kunt u een evenwicht bewaren tussen nieuwe sleutels die overeenkomen en zorgen voor een uiteindelijk resultaat binnen een redelijke tijd?