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)