与此类似,但需要哈希解决方案而不是普通键:How to atomically delete keys matching a pattern using Redis
我有一堆带有前缀的哈希值:“prefix:”
在每个散列下都有一堆键,如:“cc_XX”,其中“XX”是2个字母的代码。
我需要一些循环遍历所有redis哈希值的方法,并删除每个cc_XX子键的一些方法,并且正在寻找一种cli / lua方法来执行此操作(不是很好)。
非常感谢任何建议。
答案 0 :(得分:5)
以下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一段时间。 Atomicity有价格。
<强>更新强>
如果你不需要原子性,那么下面的脚本将避免阻塞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测试)