2011-02-11 53 views
8

我玩弄的Node.js和Redis的,並且通過此命令的Node.js,(III)的Redis和多命令

npm install hiredis redis 

我看着多實例安裝在這裏hiredis庫:

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

在第17行,它說

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

這意味着INT一旦命令執行完成,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個事務(因爲內部multi.queue對象從不清除)。

選項1:我應該在http.createServer回調函數中創建多對象,這會在函數執行結束時有效地終止它嗎?在CPU週期方面是多麼昂貴會創建和銷燬這個對象?

選項2:另一種選擇是創建multi.exec的新版本(),像multi.execAndClear(),它會清除隊列瞬間redis的執行一堆命令。

你會採取哪一種方式?我想選擇1比較好 - 我們殺一個對象,而不是採摘櫻桃的某些部分 - 我只是想確保我敢全新既節點和JavaScript。

回答

13

在node_redis多對象非常便宜的創建。作爲一個副作用,我認爲讓你重新使用它們會很有趣,但是這顯然只在某些情況下才有用。每次需要新的事務時,請繼續創建一個新的多對象。

需要記住的一件事是,如果您確實需要在Redis服務器中原子執行的所有操作,則只應使用multi。如果您只是想高效地分批處理一系列命令來節省網絡帶寬並減少必須管理的回調數量,則只需逐個發送各個命令即可。 node_redis會自動「管道」這些請求到服務器的訂單,以及各個命令的回調,如果有的話,會爲了調用。

+2

能否請您用一個例子解釋一下嗎? – 2012-05-10 06:32:55