redis集群lua脚本遇到的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis集群lua脚本遇到的问题相关的知识,希望对你有一定的参考价值。
参考技术A 遇到一个奇特的问题,记录一下,后期看看转换成数字进行比较
Redis Lua 脚本 - 如何将数组作为参数传递给 nodejs 中的 Lua 脚本?
【中文标题】Redis Lua 脚本 - 如何将数组作为参数传递给 nodejs 中的 Lua 脚本?【英文标题】:Redis Lua script - how to pass array as argument to a Lua script in nodejs? 【发布时间】:2017-05-23 17:18:21 【问题描述】:我正在从 nodejs 调用 Lua 脚本。我想传递一个数组作为参数。我在 Lua 中解析该数组时遇到问题。
下面是一个例子:
var script = 'local actorlist = ARGV[1]
if #actorlist > 0 then
for i, k in ipairs(actorlist) do
redis.call("ZADD","key", 1, k)
end
end';
client.eval(
script, //lua source
0,
['keyv1','keyv2']
function(err, result)
console.log(err+'------------'+result);
);
它给了我这个错误:
“ERR 错误运行脚本(调用 f_b263a24560e4252cf018189a4c46c40ce7d1b21a):@user_script:1: user_script:1: 'ipairs' 的参数 #1 错误(应为表,得到字符串)
【问题讨论】:
ARGV[1]
的值是多少?它如何获得它的价值?例如。它是一个包含逗号分隔的演员列表的字符串吗?
根据redis.io/commands/eval,您应该使用ARGV
或KEYS
调用client.eval(script, 2, ...
@greatwolf, ARGV[1] 将是值数组,如 ['keyv1','keyv2']
不是根据错误信息。它看到的是一个字符串,而不是一个数组。
从这个issue来看,看起来js数组传入eval
时会变成字符串。是否有理由不先解包数组并将它们作为单独的参数传递?
【参考方案1】:
您只需使用 ARGV 即可:
local actorlist = ARGV
for i, k in ipairs(actorlist) do
并像这样在控制台中传递参数:
eval "_script_" 0 arg1 arg2 argN
【讨论】:
【参考方案2】:您只能将字符串传入 Redis lua 脚本。
如果您需要将一组值传递给 Redis lua 脚本,您可以这样做:
let script = `
if #ARVG > 0 then
for i, k in ipairs(ARGV) do
redis.call("ZADD","key", 1, k)
end
end`;
client.eval(
script, //lua source
0,
...['keyv1','keyv2'],
function(err, result)
console.log(err+'------------'+result);
);
这里的关键是在调用 eval 时将 keyv1
和 keyv2
作为单独的参数传递。 (我这里用的是es6语法)
【讨论】:
以上是关于redis集群lua脚本遇到的问题的主要内容,如果未能解决你的问题,请参考以下文章