Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用redis.call(";sinter";,…)命令将多个集合与lua脚本相交_Lua_Redis_Eval_Redis Cli - Fatal编程技术网

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

使用redis.call(";sinter";,…)命令将多个集合与lua脚本相交,lua,redis,eval,redis-cli,Lua,Redis,Eval,Redis Cli,我想与多个集合相交(2个或更多)。要相交的集合数作为ARGV从命令行传递。随着从命令行传递的集合数的增加。因此redis.call()函数中的参数数量是不确定的 如何使用Lua脚本中的redis.call()函数执行此操作 但是,我编写了一个脚本,它具有类似algo的功能: 接受要在键[1]中相交的集合数 使用setIntersected=redis.call(ARGV[1],ARGV[2])将前两个集合相交 运行循环并使用setIntersected=redis.call(“sinter”、

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

如何使用
Lua
脚本中的
redis.call()
函数执行此操作

但是,我编写了一个脚本,它具有类似algo的功能:

  • 接受要在键[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
当我使用命令行传递两个集合时,这个脚本工作得很好

例如:

其中设置
点:20以上
点:30以上
。这一次它不会通过从i=3开始的for循环

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

(空列表或集合)

所以我写的求集合交集的循环有一些问题


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

您可能正在寻找的是难以捉摸的,这相当于其他语言中的“Splat”操作符

在代码中,使用以下命令:

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

也就是说,
SINTER
是可变的,可以接受多个键作为参数。除非您的脚本除了执行intesect之外还执行其他操作,否则您最好改用它。

使用Lua脚本而不是直接创建包含多个集作为参数的SINTER命令,这有什么特殊原因吗?
local intersectedVal = redis.call("sinter", unpack(setsTable))