Het volgende EVAL-script zou moeten doen wat u wilt:
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
U moet het aanroepen door de volgende parameters op te geven:
EVAL <script> 1 prefix:* cc_..
Houd er rekening mee dat het de Redis-gebeurtenislus blokkeert totdat het script is voltooid, dus het kan Redis een tijdje bevriezen als je een groot aantal sleutels hebt. Atomiciteit heeft een prijs.
Bijwerken:
Als je de atomiciteit niet nodig hebt, zal het volgende script voorkomen dat Redis te lang wordt geblokkeerd (maar let op, het blokkeert nog steeds als je een enorm globaal aantal sleutels hebt of als een van je hash-objecten enorm is:er is geen manier om dit te vermijden).
./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
(getest met bash)