sql >> Databáze >  >> NoSQL >> Redis

Jak atomicky odstranit miliony klíčů odpovídajících vzoru pomocí čistého Redis?

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?



  1. Více výrazů $elemMatch pro shodu hodnot pole pomocí $all v MongoDB?

  2. Vyhledávací řetězec se speciálními znaky v dokumentu MongoDB

  3. node.js &express - globální moduly a osvědčené postupy pro strukturu aplikací

  4. hibernujte mezipaměť druhé úrovně pomocí Redis – zlepší to výkon?