以下EVAL script应该做你想要什么:
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测试)
我应该澄清,我不需要操作是原子的。有没有简单的方法让它允许其他电话在运行时通过? – JesseP
更新了我的答案。 –
为了我的理解,该脚本正在执行以下操作? – JesseP