sql >> Databasteknik >  >> NoSQL >> Redis

Hur raderar man atomiskt miljontals nycklar som matchar ett mönster med ren Redis?

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?



  1. Redis kö med anspråk löper ut

  2. Hur man konstruerar och skickar bson-dokument - Go lang?

  3. Hitta objekt mellan två datum MongoDB

  4. Hur man projicerar arrayindex efter att ha avvecklat en array med MongoDB-aggregationsramverk