以下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