节点为Redis运行Lua脚本。如何将排序集从Lua脚本返回到Node?

时间:2017-04-28 06:10:23

标签: javascript node.js lua redis

这是文件test.lua中的Lua脚本代码:

local ips_key = 'production:ips'
local ids = redis.call('ZRANGE', ips_key, 0, '+inf', 'WITHSCORES')
local result = {}
for i, name in ipairs(ids) do
    table.insert(result, name)
end
return js.global:Array(table.unpack(result))

我正在使用ioredis,这是一个redis npm来评估这个lua脚本。返回值未定义。我究竟做错了什么?谢谢!

1 个答案:

答案 0 :(得分:1)

上述脚本存在一些问题。

L#2:ZRANGE不接受for(let i=0;i<=6;i++){ price.push({ min_price: `this.state.special_${i}_min`, max_price: `this.state.special_${i}_max` }); } (或+inf)作为参数,输入应该是有序集合中的索引 - 将其替换为-inf检索整个元素范围。

L#7:Redis&#39;中没有-1库。 Lua因此无法工作(并且无论如何都不需要)

L#7:js是Lua 5.3,而Redis是5.1 - 在需要时使用table.unpack

L#7:你不需要unpack返回的结果(如果你这样做,你只会得到阵列中的第一个元素,那就是它)

L#1我知道这是一个测试,但总是使用unpack输入表将密钥传递给脚本 - 永远不要在其中硬编码/生成密钥名称。

总而言之,这应该&#34;工作&#34;当使用单个键作为输入调用时:

KEYS

作为最后一点,目前的代码&#34;工作&#34;但什么都不做 - 它将调用结果复制到local ips_key = KEYS[1] local ids = redis.call('ZRANGE', ips_key, 0, -1, 'WITHSCORES') local result = {} for i, name in ipairs(ids) do table.insert(result, name) end return result 并返回它们。换句话说,回复与仅定期调用ZRANGE没有Lua相同。