Javascript 使用node_redis客户端正确执行Lua脚本
我试图编写一个非常简单的Lua脚本,从node_redis访问redis中的hyperloglog功能。我有1个键和多个散列作为要传递的元素。只有将键和参数硬编码如下,我才能成功完成此操作: 脚本: '返回redis.call('pfadd'、'testkey'、'valvalval')' 虽然这很好地工作,但这不是很有用 我已经尝试了所有可能的方法来访问密钥和ARGV数组,这就是我目前在.js文件中的内容:Javascript 使用node_redis客户端正确执行Lua脚本,javascript,node.js,lua,redis,Javascript,Node.js,Lua,Redis,我试图编写一个非常简单的Lua脚本,从node_redis访问redis中的hyperloglog功能。我有1个键和多个散列作为要传递的元素。只有将键和参数硬编码如下,我才能成功完成此操作: 脚本: '返回redis.call('pfadd'、'testkey'、'valvalval')' 虽然这很好地工作,但这不是很有用 我已经尝试了所有可能的方法来访问密钥和ARGV数组,这就是我目前在.js文件中的内容: var script = '\ local val = 0 \ for _, hash
var script = '\
local val = 0 \
for _, hash in pairs(ARGV) do \
redis.call("pfadd", KEYS[1], hash) \
end \
return val';
调用我的脚本:
redisInstance.eval(script, 1, args, function (ret) {
console.log(ret);
});
args是一个数组,如下所示:
['key','hash1','hash2','hash3', ...,'hash30']
回调始终为空,并且服务器上未设置任何键。。。未访问密钥和ARGV数组。。。(如我所说,当硬编码时,它工作良好.)
我需要将所有散列作为元素传递(每次总共大约30个)并接收整数回复
提前感谢您的帮助。我正在回答我自己的问题,这是aembke的评论。。。谢谢你的帮助
var script =
'\
local val = 0 \
for _,hash in pairs(ARGV) do \
val = tonumber(redis.call("pfadd", KEYS[1], hash)) \
end \
return val';
呼叫评估:
redisInstance.eval(args, function(err, res){
//use res
})
args数组:
[script, "#keys" ("1" in this case), ['key string'], ['hash1', ...., 'hash30']]
前面的答案是错误的,您需要将所有参数和值合并到单个数组(使用lodash进行采样):
无论如何,你应该考虑它支持Lua ScIrPTS的抽象。< /P>什么是“1”?在redisInstance.eval(script,1,args,function(ret){…})中,有两个快速跳出的东西:回调接受两个参数,error和result,而不仅仅是result。另外,试着像这样调用它:redisInstance.eval([script,1,['key'],['hash1',hash2']],function(error,resp){…})1指定键的数量。
var keys = _.keys(filteredData);
var values = _.values(filteredData);
var command = ["function code",keys.length];
command = command.concat(keys,values);