Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

excluir valores de hash redis em massa com base no nome da chave de hash


O seguinte script EVAL deve fazer o que você deseja:
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

Você precisa chamá-lo fornecendo os seguintes parâmetros:
EVAL <script> 1 prefix:* cc_..

Observe que ele bloqueia o loop de eventos do Redis até que o script seja concluído, para que ele possa congelar o Redis por um tempo se você tiver um grande número de chaves. Atomicidade tem um preço.

Atualização:

Se você não precisar da atomicidade, o script a seguir evitará bloquear o Redis por muito tempo (mas observe que ele ainda bloqueará se você tiver um grande número global de chaves ou se um de seus objetos de hash for enorme:há não há como evitar isso).
./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

(testado com bash)