Följande Lua-skript använder SCAN
kommandot, så att det raderas i bitar i skriptet - och undviker felet "för många element att packa upp".
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
Den returnerar hur många gånger SCAN
anropades och hur många nycklar som raderades.
Använd 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
Observera att den blockerar servern medan den körs, så den rekommenderas inte för produktion som den är.
För produktion, överväg att ändra DEL
för UNLINK
. Du kan också returnera markören (istället för att upprepa inuti skriptet tills det är noll) och lägga till COUNT parameter till SCAN för att gasa (se Finns det något rekommenderat värde på COUNT för SCAN / HSCAN kommando i REDIS?). På så sätt gör du det i bitar istället för en gång, liknande Hur kan jag få alla uppsättningar i redis?
Eller så kan du göra något mer sofistikerat med det tillvägagångssätt som anges i det här svaret:Redis `SCAN`:hur man upprätthåller en balans mellan nya inkommande nycklar som kan matcha och säkerställa ett slutligt resultat inom rimlig tid?