Таким образом, я нахожусь в поиске сценария 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;
Что бы вертело бы следующие "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*', //pattern
1 => 100, //count for SCAN
];
var_dump($redis->eval($script, $args_arr, 0));