NodeRedis client.multi()hgetall性能

时间:2017-04-14 10:10:25

标签: node.js redis node-redis

节点版本:v7.4.0

node-redis version: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;
        });

    });

}

其他人是否同意这是糟糕的表现,我在上面的代码中做了什么,这是问题的一部分?

2 个答案:

答案 0 :(得分:2)

您正在为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;
        });
    });
}

答案 1 :(得分:0)

答案来自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秒秒