2013-04-30 86 views
3

給出一個簡單的例子:如何(重新)在nodejs/express中使用redis客戶端連接?

var express = require("express") 
var redis = require('redis') 
var app = express() 

var client = redis.createClient() 

app.get('/', function(req, res) { 
    req.connection.setTimeout(2 * 1000) 
    client.set("test", 1, function (err, resp) { 
     res.send('Hello World') 
    }) 
}) 

app.listen(80) 

Redis的連接不需要重新建立爲每一個請求,不是嗎?

您是否需要使用redis連接池?

回答

3

你只需要一個連接到你的服務器的redis,並且你只需要關閉它,如果你的服務器停止。你的服務器只是作爲一個進程運行。

+7

如果您使用pub \ sub渠道,這是錯誤的。如果您的連接爲了原子操作而設置手錶也是錯誤的。不要這樣做。 – Eric 2014-02-18 17:59:18

+0

它是否也適用於每分鐘處理50K請求的服務器?並且每個請求執行至少2個Redis操作(GET/SET)。與Redis的單一連接是否足夠? – 2015-12-04 13:04:09

+0

@AyazPasha使用「redis-benchmark」命令執行您將使用的操作,例如: redis-benchmark -t ping,set,get -n 50000 – mzalazar 2016-10-24 22:09:56

0

您無需在每個請求上打開和關閉連接。

在您的示例中,即使請求處理異步,回調也會始終在正確的上下文中執行。 但是,你應該小心非原子事務,因爲他們可以搞砸你的數據庫。使用多司令部意識到這一點

5

回覆化身的連接池後:

嗨 - 首先澄清,Redis的服務器IS單線程的。

您在命令排序方面看到的是您使用異步的方式的一個人爲因素,與node_redis庫或Redis本身無關。

連接池與node_redis是絕對不需要。你當然可以使用它,但不建議。連接池會降低Redis流水線的有效性,並且由於Redis協議的有狀態特性,可能會因某些命令而出現問題。

理由1:我不知道這是顯著,或可能通過創建額外的客戶端這是一個額外的負擔GC更糟。

原因#2:這不是真的如何工作。 Redis服務器是單線程的。如果您在服務器上等待,所有客戶端都在服務器上等待。如果您在javascript中被阻止,則該進程中的所有客戶端都會被javascript阻止。

原因#3:失敗後,node_redis庫已重新連接。

+0

感謝您的詳細解釋。我當然錯過的關鍵是Redis * IS *實際上是單線程的。再次感謝你! – incarnate 2013-11-20 12:16:32

相關問題