使用 EVAL、SCAN 和 DEL 的 Redis 通配符删除脚本返回“非确定性命令后不允许写命令”。

所以我正在建立一个使用SCAN的lua脚本,根据模式查找键并删除它们(原子性)。我首先准备了以下脚本

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;

这将返回以下“Err:@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*',   //模式
          1 => 100,     //SCAN的数量
  ];
  var_dump($redis->eval($script, $args_arr, 0));
点赞