sql >> Database teknologi >  >> NoSQL >> Redis

Hvordan kan man atomisk slette millioner af nøgler, der matcher et mønster ved hjælp af ren Redis?

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?



  1. Kæmpe forsinkelse ved brug af Selleri + Redis

  2. Mongo kompleks sortering?

  3. mongodb 3.x driver Android kompatibilitet

  4. Hvornår skal man bruge et nøgle-/værdilager såsom Redis i stedet for/ved siden af ​​en SQL-database?