2011-02-11 12 views
8

Sto giocando intorno con node.js e Redis e installato la libreria hiredis tramite questo comandoNode.js, (Hi) Redis e il comando a più

npm install hiredis redis 

ho guardato il multi esempi qui:

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

alla linea 17 si dice

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

il che implica che l'int L'oggetto ernale multi.queue non viene mai cancellato una volta che i comandi hanno terminato l'esecuzione.

La mia domanda è: come gestireste la situazione in un ambiente http? Per esempio, il monitoraggio l'ultimo utente connesso (questo non ha realmente bisogno più come solo esegue un comando, ma è facile da seguire)

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

In questo caso, sarebbe multi.exec eseguire 1 transazione per la prima collegato utente e 100 transazioni per il 100 ° utente (poiché l'oggetto multi.queue interno non viene mai cancellato).

Opzione 1: Devo creare il multi oggetto all'interno della funzione di callback http.createServer, che lo ucciderebbe efficacemente alla fine dell'esecuzione della funzione? Quanto sarebbero costosi in termini di cicli di CPU la creazione e la distruzione di questo oggetto?

Opzione 2: L'altra opzione sarebbe quella di creare una nuova versione di multi.exec(), qualcosa come multi.execAndClear(), che cancellerà la coda le Redis momento eseguito che gruppo di comandi.

Quale opzione daresti? Suppongo che l'opzione 1 sia migliore - stiamo uccidendo un oggetto invece di parti di cherry picking - voglio solo essere sicuro di essere nuovo di zecca sia per i nodi che per i javascript.

risposta

13

I multi oggetti in node_redis sono molto economici da creare. Come effetto collaterale, ho pensato che sarebbe stato divertente permetterti di riutilizzarli, ma ovviamente è utile solo in alcune circostanze. Vai avanti e crea un nuovo multioggetto ogni volta che hai bisogno di una nuova transazione.

Una cosa da tenere a mente è che si dovrebbe usare solo multi se si ha effettivamente bisogno di tutte le operazioni da eseguire atomicamente nel server Redis. Se vuoi semplicemente raggruppare una serie di comandi in modo efficiente per risparmiare larghezza di banda della rete e ridurre il numero di callback che devi gestire, basta inviare i singoli comandi, uno dopo l'altro. node_redis automaticamente "pipeline" queste richieste al server in ordine, e le singole callback del comando, se presenti, verranno invocate in ordine.

+2

puoi spiegare questo con un esempio? –

+0

Idem sulla spiegazione. La documentazione dice che drena la coda. Dato che è possibile rieseguire l'exec e farlo ripetere i comandi è molto confuso. – maletor

Problemi correlati