Følgende Lua-script bruger SCAN
kommando, så den sletter i bidder i scriptet - undgår fejlen "for mange elementer til at pakke ud".
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
Det returnerer hvor mange gange SCAN
blev kaldt, og hvor mange nøgler der blev slettet.
Brug som:
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
Bemærk, at den vil blokere serveren, mens den kører, så den frarådes til produktion, som den er.
For produktion, overveje at ændre DEL
for UNLINK
. Du kan også returnere markøren (i stedet for at gentage inde i scriptet, indtil det er nul) og tilføje COUNT parameter til SCAN for at drosle (se Er der nogen anbefalet værdi af COUNT for SCAN / HSCAN kommando i REDIS?). På denne måde gør du det i bidder i stedet for én gang, svarende til Hvordan kan jeg få alle sæt i redis?
Eller du kan gøre noget mere sofistikeret ved at bruge den tilgang, der er angivet i dette svar:Redis `SCAN`:hvordan opretholder man en balance mellem nye indkommende nøgler, der kan matche og sikre et endeligt resultat inden for en rimelig tid?