我想根据某些正则表达式删除正在生产的redis数据库中的密钥。
我考虑过各种解决方案: How to atomically delete keys matching a pattern using Redis
Like - 扫描所有键,直到光标返回“0”位置并将键存储在某处,然后最后删除键。 但这是在SCAN命令后产生非确定性操作的错误。
另外,如果使用从一个lua脚本到另一个lua脚本的密钥存储,从redis删除密钥;还有另外一个问题。
命令看起来像这样 - 从第1个lua脚本输出|输入到第二个删除lua脚本
现在,在第一个脚本中 - 它创建了一个阻塞操作,我不知道为什么? 试着自己只运行第一个脚本!!!
任何一个解决方案都可以用于生产并且没有阻塞操作?
这是我的第一个lua脚本
local all_keys = {};
local used_keys = {};
local keys = {};
local sum = 0;
local done = false;
local cursor = "0"
repeat
local result = redis.call("SCAN", cursor, "match", ARGV[1])
cursor = result[1];
keys = result[2];
for i, key in ipairs(keys) do
-- sum = sum + redis.call("HLEN",key);
used_keys[#used_keys+1] = key;
end
if cursor == "0" then
done = true;
end
until done
return used_keys;
第二个lua脚本:
for i,k in ipairs(KEYS) do
redis.call("DEL", k);
end
--redis.call("DEL",KEYS);
return true;
使用的命令是:
time redis-cli --eval FirstScript.lua,'*'| xargs redis-cli --eval SecondScript.lua