Следният EVAL скрипт трябва да прави това, което искате:
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
Трябва да го извикате, като предоставите следните параметри:
EVAL <script> 1 prefix:* cc_..
Моля, имайте предвид, че блокира цикъла на събитията Redis, докато скриптът не завърши, така че може да замрази Redis за известно време, ако имате голям брой ключове. Атомността има цена.
Актуализация:
Ако нямате нужда от атомарност, следният скрипт ще избегне блокирането на Redis твърде дълго (но, моля, имайте предвид, че той все още ще блокира, ако имате огромен глобален брой ключове или ако един от вашите хеш обекти е огромен:има няма начин да се избегне това).
./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
(тествано с bash)