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

eliminare i valori hash redis in blocco in base al nome della chiave hash

Il seguente script EVAL dovrebbe fare quello che vuoi:

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

Devi chiamarlo fornendo i seguenti parametri:

EVAL <script> 1 prefix:* cc_..

Tieni presente che blocca il ciclo di eventi Redis fino al completamento dello script, quindi può bloccare Redis per un po' se hai un numero elevato di chiavi. L'atomicità ha un prezzo.

Aggiornamento:

Se non hai bisogno dell'atomicità, il seguente script eviterà di bloccare Redis per troppo tempo (ma tieni presente che si bloccherà comunque se hai un numero globale enorme di chiavi o se uno dei tuoi oggetti hash è enorme:c'è nessun modo per evitarlo).

./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

(testato con bash)