Le script EVAL suivant devrait faire ce que vous voulez :
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
Vous devez l'appeler en fournissant les paramètres suivants :
EVAL <script> 1 prefix:* cc_..
Veuillez noter qu'il bloque la boucle d'événements Redis jusqu'à ce que le script soit terminé, il peut donc geler Redis pendant un certain temps si vous avez un grand nombre de clés. L'atomicité a un prix.
Mise à jour :
Si vous n'avez pas besoin de l'atomicité, alors le script suivant évitera de bloquer Redis trop longtemps (mais attention, il bloquera quand même si vous avez un grand nombre global de clés ou si l'un de vos objets de hachage est énorme :il y a aucun moyen d'éviter cela).
./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
(testé avec bash)