【问题标题】:NodeRedis client.multi() hgetall performanceNodeRedis client.multi() hgetall 性能
【发布时间】:2017-04-14 10:10:25
【问题描述】:

节点版本:v7.4.0

node-redis 版本:v.2.6.2

redis_version:2.8.4

ubuntu 14.04 2GB RAM VPS 实例

我得到的迹象表明 node_redis hgetall 的性能不是应该的,但可能我做错了什么。我有一个包含 31669 个元素的排序集。元素是散列键,每个散列有 14 个字段,大约 256 个字节。检索哈希需要大约 64 秒,这似乎太慢了。 下面是函数的样子:

function getAllAnnotations()
{
var currentSeconds = Math.floor((new Date()).getTime() / 1000);
console.log('currentSeconds before zrange: ' + currentSeconds);

    client.zrangebyscore("geoHashSortedSet", "-inf", "+inf", function(err, reply) {

        multi = client.multi();
        for (var uuid in reply) {
            multi.hgetall(reply[uuid]);

        }
        multi.exec(function(err, replies) {

            var currentSeconds = Math.floor((new Date()).getTime() / 1000);
            console.log('currentSeconds after multi returns: ' + currentSeconds);
            allAnnotations = replies;
        });

    });

}

这里的其他人是否同意这是较差的性能,我在上面的代码中做的任何事情是问题的一部分吗?

【问题讨论】:

  • 你试过client.batch()吗?您不仅要为批处理计时,还要为zrangebyscore 计时。
  • 我会尝试 client.batch()。是的,我知道我正在计时 zrangebyscore。可能我不应该包括它。谢谢。

标签: node.js redis node-redis


【解决方案1】:

您也在计时zrangebyscore,并且您正在使用-inf+inf,这意味着整个元素。为什么注意使用zrange 而不是0-1。这可能会更快。

试试这个

function getAllAnnotations()
{
    var start = Date.now();

    client.zrange("geoHashSortedSet", 0, -1, function(err, reply) {
        console.log('zrange took ', Date.now() - start);
        start = Date.now();

        multi = client.multi();
        reply.forEach(function(id) {
            multi.hgetall(id);
        });
        multi.exec(function(err, replies) {

            console.log('multi took', Date.now() - start);
            allAnnotations = replies;
        });
    });
}

【讨论】:

  • 我想要整个元素,而且我认为 zrangebyscore 时间会相当微不足道,所以这就是我最初包含它的原因。我将 zrange 与 zrangebyscore 进行了比较,它们几乎同时从 redis-cli 运行。谢谢,但是我从 node-redis 维护者那里得到了答案。
【解决方案2】:

答案来自 NodeRedis 维护者:

您很可能使用的是较旧的 redis-parser 版本,该版本仍然存在大型嵌套数组的问题。该实现有一个在开始时被忽略的缺陷。

更新依赖项后,您的问题就会消失。附带说明:如果您没有必要进行事务处理,则通过使用批处理而不是多,您的性能应该会再次上升。

总体而言,您的通话时间不会太长。

参考:https://github.com/NodeRedis/node_redis/issues/1225

我使用的 redis-parser 版本是 v.2.0.3 - 2016 年 6 月 17 日。更新到 v.2.6.0 - 2017 年 4 月 3 日解决了这个问题,因为我的时间从 ~64 秒下降到 ~2 秒秒

【讨论】:

    猜你喜欢
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2014-06-01
    • 2012-10-21
    • 2011-12-26
    • 2014-04-02
    • 2017-09-03
    相关资源
    最近更新 更多