Lua 中 Redis 遍历 SCAN 的推荐方法是什么?

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

点赞
用户3160475
用户3160475

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

2017-06-30 11:52:47