【问题标题】:Properly execute Lua script with node_redis client使用 node_redis 客户端正确执行 Lua 脚本
【发布时间】:2014-11-06 04:46:52
【问题描述】:

我正在尝试编写一个非常简单的 Lua 脚本来从 node_redis 访问 redis 中的 hyperloglog 功能。我有 1 个键和多个哈希作为要传递的元素。只有当我硬编码密钥和参数时,我才能成功地做到这一点,如下所示:

脚本: 'return redis.call("pfadd", 'testkey', 'valvalval')'

虽然这很好用,但这不是很有用......

我已经尝试了所有我能想到的访问 KEYS 和 ARGV 数组的方法,这就是我目前在 .js 文件中的内容:

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']

回调始终为空,并且在服务器上没有设置任何键... KEYS 和 ARGV 数组未被访问...(如我所说的硬编码时,它工作正常...)

我需要将所有哈希作为元素传递(每次总共大约 30 个)并接收整数回复。

提前感谢您的帮助。

【问题讨论】:

  • 什么是'1'?在 redisInstance.eval(script, 1, args, function (ret) {...} ?
  • 一些快速的东西跳出来:回调有两个参数,错误和结果,而不仅仅是结果。另外,尝试像这样调用它: redisInstance.eval([script, 1, ['key'], ['hash1', 'hash2']], function(error, resp){ ... })
  • 1指定键的个数。

标签: javascript node.js lua redis


【解决方案1】:

上一个答案是错误的,你需要将所有参数和值连接到单个数组(使用 lodash 示例):

var keys = _.keys(filteredData);
var values = _.values(filteredData); 
var command = ["function code",keys.length];
command = command.concat(keys,values);

无论如何你应该考虑ioredis,因为它支持lua 脚本的抽象。

【讨论】:

    【解决方案2】:

    我正在回答我自己的问题,这是 aembke 的评论...感谢 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']]   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      • 2018-02-24
      • 2013-12-21
      • 2015-07-17
      • 2018-05-25
      相关资源
      最近更新 更多