因此,我正在寻求构建一个 lua 脚本,该脚本使用 SCAN 根据模式查找键并删除它们(原子地)。我首先准备了以下脚本
local keys = {};
local done = false;
local cursor = "0"
repeat
local result = redis.call("SCAN", cursor, "match", ARGV[1], "count", ARGV[2])
cursor = result[1];
keys = result[2];
for i, key in ipairs(keys) do
redis.call("DEL", key);
end
if cursor == "0" then
done = true;
end
until done
return true;
这会吐出以下“错误:@user_script:9:在非确定性命令后不允许写入命令”所以我想了一下并想出了以下脚本:
local all_keys = {};
local keys = {};
local done = false;
local cursor = "0"
repeat
local result = redis.call("SCAN", cursor, "match", ARGV[1], "count", ARGV[2])
cursor = result[1];
keys = result[2];
for i, key in ipairs(keys) do
all_keys[#all_keys+1] = key;
end
if cursor == "0" then
done = true;
end
until done
for i, key in ipairs(all_keys) do
redis.call("DEL", key);
end
return true;
仍然返回相同的错误(@user_script:17:在非确定性命令之后不允许写入命令)。这让我难住了。有什么办法可以规避这个问题吗?
脚本是使用 phpredis 和以下内容运行的
$args_arr = [
0 => 'test*', //pattern
1 => 100, //count for SCAN
];
var_dump($redis->eval($script, $args_arr, 0));