2017-04-14 2 views
0

노드 버전 : v.2.6.2NodeRedis client.multi() hgetall 성능

redis_version : 2.8.4

우분투 14.04 2기가바이트 RAM VPS 인스턴스

노드 레디 스 버전 v7.4.0

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; 
     }); 

    }); 

} 

여기에 다른 사람이 성능 저하 것을 동의 하는가, 그리고 그 문제의 일부입니다 위의 코드에서하고있어 거기에 아무것도 : 여기 함수의 모습인가?

+0

['client.batch()'] (https://github.com/NodeRedis/node_redis#clientbatchcommands)를 사용해 보셨습니까? 또한 배치의 타이밍을 정하는 것이 아니라 'zrangebyscore'도 있습니다. – robertklep

+0

나는 client.batch()를 시도 할 것이다. 그리고 예, 나는 zrangebyscore를 타이밍한다는 것을 알고있었습니다. 아마 나는 그것을 포함해서는 안된다. 감사. – bhartsb

답변

2

zrangebyscore도 타이밍이 맞고 전체 요소를 의미하는 -inf ~ +inf을 사용하고 있습니다. 대신 0-1 대신 zrange을 사용하는 이유는 무엇입니까? 그럴 수 있습니다.

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; 
     }); 
    }); 
} 
+0

나는 zrangebyscore 시간이 상당히 중요하지 않을 것이라고 생각했기 때문에 전체 요소를 원한다. 그래서 원래 그것을 포함했다. zrange와 zrangebyscore를 비교했을 때, 그들은 거의 같은 시간에 redis-cli에서 실행됩니다. 고마워,하지만 노드에서 얻은 해답 - redis 관리자. – bhartsb

0

대답은 NodeRedis 메인테이너에서 온 시도해보십시오

당신은 매우 가능성이 여전히 큰 중첩 배열에 문제가 있던 오래된 레디 스 파서의 버전을 사용하고 있습니다. 구현에는 처음에 간과 된 결함이있었습니다.

종속성을 업데이트하자 마자 문제가 해결됩니다. 참고 사항 : 멀티 대신 일괄 처리를 사용하면 거래를 할 필요가 없다면 실적이 다시 올라갈 것입니다.

전체적으로 통화 변경에 오래 걸리지 않을 것입니다.

심판 : https://github.com/NodeRedis/node_redis/issues/1225

내가 사용 된 레디 스 파서 버전 v.2.0.3이었다 - 6월 17일이 v.2.6.0로 2016 년 업데이트 - 내 시간이가는 때 2017년 4월 3일이 문제를 해결 ~ 64 초에서 ~ 2 초까지