我一直在寻找使用Lua迭代SCAN的推荐方法,并且想知道是否有“最佳实践”可以这么说。下面的脚本是迄今为止我能找到的最好的。有没有人有什么要补充的?使用COUNT 1000000000进行迭代是否明智?那会不会阻塞?
local ans, has, cursor = {}, {}, "0";
repeat
local t = redis.call("SCAN", cursor, "MATCH", KEYS[1], "COUNT", 1000000000);
local list = t[2];
for i = 1, #list do
local s = list[i];
if has[s] == nil then has[s] = 1; ans[#ans + 1] = s; end;
end;
cursor = t[1];
until cursor == "0";
return #ans; --or return ans;
取自:https://github.com/antirez/redis/issues/3190#issuecomment-214022437
答案 0 :(得分:1)
脚本将在运行时阻塞,直到它结束 - 在您的示例中,SCAN
ning完成后将会发生。 COUNT
命令的SCAN
提示越大,每次调用它的结果都会越多,从而导致存储回复所需的RAM越多(变量t
)。这可能会导致内存不足,因此您应该避免使用如此大的COUNT
值。我建议坚持使用默认值(100),只省略COUNT
提示。