sql >> Base de Datos >  >> NoSQL >> Redis

elimine los valores hash redis de forma masiva en función del nombre de la clave hash

La siguiente secuencia de comandos EVAL debería hacer lo que desea:

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

Debe llamarlo proporcionando los siguientes parámetros:

EVAL <script> 1 prefix:* cc_..

Tenga en cuenta que bloquea el ciclo de eventos de Redis hasta que se completa el script, por lo que puede congelar Redis por un tiempo si tiene una gran cantidad de claves. La atomicidad tiene un precio.

Actualización:

Si no necesita la atomicidad, la siguiente secuencia de comandos evitará el bloqueo de Redis durante demasiado tiempo (pero tenga en cuenta que aún se bloqueará si tiene una gran cantidad global de claves o si uno de sus objetos hash es enorme:hay no hay manera de evitar esto).

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

(probado con bash)