Poniższy skrypt EVAL powinien zrobić to, co chcesz:
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
Musisz go wywołać, podając następujące parametry:
EVAL <script> 1 prefix:* cc_..
Pamiętaj, że blokuje pętlę zdarzeń Redis, dopóki skrypt nie zostanie ukończony, więc może zawiesić Redis na chwilę, jeśli masz dużą liczbę kluczy. Atomowość ma swoją cenę.
Aktualizacja:
Jeśli nie potrzebujesz atomowości, poniższy skrypt pozwoli uniknąć blokowania Redis przez zbyt długi czas (ale pamiętaj, że nadal będzie blokował, jeśli masz ogromną globalną liczbę kluczy lub jeśli jeden z twoich obiektów mieszających jest ogromny:istnieje nie ma sposobu, aby tego uniknąć).
./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
(testowane z bashem)