我一直在寻找使用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

最佳答案

该脚本将在运行时阻止,直到结束-在您的示例中,一旦SCAN ning完成,该脚本就会发生。 COUNT命令的SCAN提示越大,每次调用返回的结果就越多,从而需要更多的RAM来存储答复(变量t)。这可能会导致内存不足的情况,因此您应避免使用如此大的COUNT值。我建议坚持使用默认值(100),而忽略COUNT提示。

关于lua - 在Lua中为Redis迭代SCAN的推荐方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44842430/

10-14 22:14