2011-02-11 2 views
8

내가 Node.js를하고 레디 스 놀아 나는 여기에 여러 예제를 보면서이 명령Node.js를, (안녕) 레디 스 및 멀티 명령

npm install hiredis redis 

를 통해 hiredis 라이브러리를 설치 해요 :

행에서

https://github.com/mranney/node_redis/blob/master/examples/multi2.js

17 그것은 INT 것을 의미한다

// you can re-run the same transaction if you like 

을 말한다 명령이 실행을 완료하면 ernal multi.queue 객체는 지워지지 않습니다.

제 질문은 http 환경에서 어떻게 처리하겠습니까? 이 경우

var http = require('http'); 
redis = require('redis'); 

client = redis.createClient() 
multi = client.multi(); 

http.createServer(function (request, response) { 
    multi.set('lastconnected', request.ip); // won't work, just an example 
    multi.exec(function(err, replies) { 
     console.log(replies); 
    }); 
}); 

을 예를 들어, 마지막으로 연결된 사용자를 추적 (그것은 단지 하나 개의 명령을 실행하지만 따라 쉽게로이 정말 다 필요하지 않습니다), multi.exec가 연결되어 최초의 1 트랜잭션을 실행하는 것입니다 사용자 및 100 번째 사용자에 대한 100 개의 트랜잭션 (내부 다중 대기열 객체는 절대로 지워지지 않기 때문에).

옵션 1 : http.createServer 콜백 함수 내에 다중 객체를 만들어야 만합니다.이 함수는 함수 실행이 끝날 때 효과적으로 종료 할 수 있습니까? 이 객체를 생성하고 파괴하는 데 CPU 사이클 측면에서 얼마나 비쌉니까?

는 옵션 2 :는 다른 옵션은 multi.exec의 새 버전을 생성하는 것입니다(), 큐에게 순간 레디 스를 지 웁니다 multi.execAndClear 같은 일이() 명령의 무리를 실행.

어떤 옵션을 택하겠습니까? 나는 옵션 1이 더 좋다고 생각합니다 - 우리는 체리 피킹 대신 하나의 오브젝트를 죽이고 있습니다 - 저는 노드와 자바 스크립트 둘 다에 전혀 새로운 것을 확신하고 싶습니다.

답변

13

node_redis의 다중 객체는 매우 저렴하게 만들 수 있습니다. 부작용으로, 나는 당신이 그들을 재사용하게하는 것이 재미있을 거라고 생각했는데, 이것은 분명히 어떤 경우에만 유용하다. 새로운 트랜잭션이 필요할 때마다 새로운 다중 객체를 생성하십시오.

명심해야 할 점 중 하나는 실제로 모든 작업이 Redis 서버에서 원자 적으로 실행되어야하는 경우에만 멀티를 사용해야한다는 것입니다. 일련의 명령을 효율적으로 배치하여 네트워크 대역폭을 절약하고 관리해야하는 콜백 수를 줄이려면 개별 명령을 차례로 보내십시오. node_redis는 자동으로 이들 요청을 서버에 "파이프 라인"하여 개별 명령 콜백이있는 경우이를 순서대로 호출합니다.

+2

예를 들어 설명해 주시겠습니까? –

+0

설명에 관한 내용입니다. 설명서에 대기열이 고갈되었다고 나와 있습니다. exec를 다시 실행하고 명령을 반복하도록하면 매우 혼란 스럽습니다. – maletor