Následující skript Lua používá SCAN
příkaz, takže se ve skriptu odstraní po částech – zabrání se tak chybě „příliš mnoho prvků k rozbalení“.
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
Vrací, kolikrát SCAN
bylo voláno a kolik klíčů bylo smazáno.
Použít jako:
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
Všimněte si, že zablokuje server během běhu, takže se nedoporučuje pro produkci tak, jak je.
Pro produkci zvažte změnu DEL
pro UNLINK
. Můžete také vrátit kurzor (místo opakování uvnitř skriptu, dokud nebude nula) a přidat parametr COUNT do SCAN k omezení (viz Existuje nějaká doporučená hodnota COUNT pro příkaz SCAN / HSCAN v REDIS?). Tímto způsobem to uděláte po kouscích místo jednoho kroku, podobně jako Jak mohu získat všechny sady v redis?
Nebo můžete udělat něco sofistikovanějšího pomocí přístupu uvedeného v této odpovědi:Redis `SCAN`:jak udržet rovnováhu mezi nově příchozími klíči, které se mohou shodovat, a zajistit konečný výsledek v rozumném čase?