使用redis.call(";sinter";,…)命令将多个集合与lua脚本相交
我想与多个集合相交(2个或更多)。要相交的集合数作为ARGV从命令行传递。随着从命令行传递的集合数的增加。因此redis.call()函数中的参数数量是不确定的 如何使用使用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”、
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))