【问题标题】:Node running Lua script for Redis. How to return sorted set from Lua script to Node?运行 Redis 的 Lua 脚本的节点。如何将排序集从 Lua 脚本返回到 Node?
【发布时间】:2017-09-26 03:44:23
【问题描述】:

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

【问题讨论】:

  • 您能与我们分享您使用/调用 .lua 脚本的 javascript 吗?

标签: javascript node.js lua redis


【解决方案1】:

上面的脚本有几个问题。

L#2:ZRANGE 不接受 +inf(或 -inf)作为参数,输入应该是排序集中的索引 - 将其替换为 -1 以检索整个元素范围。

L#7:Redis 的 Lua 中没有 js 库,因此它不起作用(而且也不需要)

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

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

L#1 我知道这是一个测试,但始终使用 KEYS 输入表将您的密钥传递给脚本 - 切勿在其中硬编码/生成密钥名称。

总而言之,当使用单个键作为输入调用时,这应该“有效”:

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 定期调用 ZRANGE 相同。

【讨论】:

  • 非常感谢您的回复。我尝试了您的脚本,但出现此错误:ReplyError:ERR 错误运行脚本(调用 f_141e3442dff9d575f86f6a4a2e642ba1cf6abc01):@user_script:7:脚本被用户使用 SCRIPT KILL... 杀死。需要明确的是,我是从 node.js 调用我的 lua 脚本。
  • 这个错误意味着有人(你?)杀死了长时间运行的脚本。您的排序集越大,脚本运行的时间就越长(并且需要更多的 RAM)。
猜你喜欢
  • 1970-01-01
  • 2021-09-29
  • 2016-08-10
  • 2017-06-26
  • 1970-01-01
  • 2016-06-19
  • 2015-08-30
  • 2015-10-27
  • 2020-03-18
相关资源
最近更新 更多