【发布时间】:2017-11-17 14:25:36
【问题描述】:
我想与多个集合(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
当我使用命令行传递两个集合时,此脚本运行良好。
EG:
redic-cli --eval scriptfile.lua 2 , points:Above20 points:Above30
output:-
1) "playerid:1"
2) "playerid:2"
3) "playerid:7"
其中points:Above20 和points:Above30 是集合。这次它没有经过从 i = 3 开始的 for 循环。
但是当我通过 3 组时,我总是得到如下输出:
(空列表或集合)
所以我编写的用于查找集合交集的循环存在一些问题。
我哪里错了?有什么优化的方法可以直接找到多组的交集吗?
【问题讨论】:
-
您使用 Lua 脚本而不是直接创建具有多个集作为参数的 SINTER 命令是否有特殊原因?