lua - 使用 redis.call ("sinter", ...) 命令将多个集与 lua 脚本相交

标签 lua redis eval redis-cli

我想交叉多个集合(2 个或更多)。要相交的集合数作为 ARGV 从命令行传递。随着从命令行传递的集合数量。所以redis.call()函数的参数个数是不确定的。

如何在 Lua 脚本中使用 redis.call() 函数。

但是,我写了一个脚本,它的算法如下:

  • 接受 KEYS[1] 中要相交的集合的数量。
  • 使用 setIntersected = redis.call(ARGV[1], ARGV[2]) 将前两组相交。
  • 运行循环并使用 setIntersected = redis.call("sinter", tostring(setIntersected), set[i])
  • 最后我应该得到相交集。

上述算法的代码是:

local noOfArgs = KEYS[1] -- storing the number of arguments that will get passed from cli

--[[
    run a loop noOfArgs time and initialize table elements, since we don't know the number of sets to be intersected so we will use Table (arrays)
--]]

local setsTable = {}

for i = 1, noOfArgs, 1 do
    setsTable[i] = tostring(ARGV[i])
end


-- now find intersection
local intersectedVal = redis.call("sinter", setsTable[1], setsTable[2]) -- finding first intersection because atleast we will have two sets
local new_updated_set = ""
for i = 3, noOfArgs, 1 do
    new_updated_set = tostring(intersectedVal)
    intersectedVal = redis.call("sinter", new_updated_set, setsTable[i])
end

return intersectedVal

当我使用命令行传递两个集合时,此脚本工作正常。

如:

redic-cli --eval scriptfile.lua 2 , points:Above20 points:Above30

 output:-  

 1) "playerid:1"

 2) "playerid:2"

 3) "playerid:7"

其中 points:Above20points:Above30 是集合。这次它没有经过从 i = 3 开始的 for 循环。

但是当我通过 3 组时,我总是得到如下输出:

(empty list or set)

所以我编写的用于查找集合交集的循环存在一些问题。

我哪里错了?有什么优化的方法可以直接找到多个集合的交集吗?

最佳答案

您可能正在寻找难以捉摸的 unpack() Lua command ,相当于其他语言中的“Splat”运算符。

在您的代码中,使用以下内容:

local intersectedVal = redis.call("sinter", unpack(setsTable))

也就是说,SINTER 是可变的,可以接受多个键作为参数。除非你的脚本除了 intesects 之外还做了一些事情,否则你最好改用它。

关于lua - 使用 redis.call ("sinter", ...) 命令将多个集与 lua 脚本相交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44561633/

相关文章:

垃圾收集中的 luajit 段错误

for-loop - 在 torch7 中初始化张量的快速方法

redis - 确保redis中排序集的唯一性

shell - xargs 执行字符串 - 我做错了什么?

perl - 我怎样才能避免在 Perl 中使用 "eval"?

r - 在 names<-() 中创建对象会出错。如何解释?

debugging - 从协程内省(introspection) _ENV

c# - ServiceStack 的 RedisTypedClient - 可以使用字符串来定义类型吗?

redis - 从键列表中获取所有哈希值

memory - 使用自定义 Lua 分配器计算内存使用情况,但其结果与 collectgarbage ('count' 不同)