这是文件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脚本。返回值未定义。我究竟做错了什么?谢谢!
答案 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相同。