sql >> Databasteknik >  >> NoSQL >> Redis

radera redis-hashvärden i bulk baserat på hash-nyckelns namn

Följande EVAL-skript ska göra vad du vill:

local keys = redis.call('KEYS',KEYS[1])
for i,k in ipairs(keys) do
    local res = redis.call('HKEYS',k)
    for j,v in ipairs(res) do
        if string.find(v,ARGV[1]) then
            redis.call('HDEL',k,v)
        end
    end
end

Du måste anropa det genom att ange följande parametrar:

EVAL <script> 1 prefix:* cc_..

Observera att det blockerar Redis-händelseloopen tills skriptet är klart, så det kan frysa Redis ett tag om du har ett stort antal nycklar. Atomicitet har ett pris.

Uppdatering:

Om du inte behöver atomiciteten, kommer följande skript att undvika att blockera Redis för länge (men observera att det fortfarande blockeras om du har ett enormt globalt antal nycklar eller om ett av dina hashobjekt är enormt:det finns inget sätt att undvika detta).

./redis-cli keys 'prefix:*' | awk '
BEGIN {
    script = "local res = redis.call('\''HKEYS'\'',KEYS[1]); \
          for j,v in ipairs(res) do                          \
            if string.find(v,ARGV[1]) then                   \
              redis.call('\''HDEL'\'',KEYS[1],v);            \
            end                                              \
          end"
}
{
    printf "EVAL \"%s\" 1 %s cc_..\n", script, $1
}' | ./redis-cli

(testad med bash)



  1. MongoDB och Robomongo:Kan inte ansluta (autentisering)

  2. Java Mongodb nummerlång fråga

  3. meteor:hur kan jag säkerhetskopiera min mongodatabas

  4. MongoDB -- Ange ett villkorligt uttalande i .find()