2013-05-17 82 views
8

我正在開發一個node.js應用程序,而且我需要沉重的Redis使用。該應用程序將在8個CPU內核上執行cluster我應該在文件/模塊之間共享Redis連接嗎?

現在我有100個併發連接到Redis,因爲每個CPU的每個工作人員都有幾個運行require('redis').createClient()的模塊。

情形A:

file1.js:

var redis = require('redis').createClient(); 

file2.js

var redis = require('redis').createClient(); 

SCENARIO B:

redis.js

var redis = require('redis').createClient(); 

module.exports = redis; 

file1.js

var redis = require('./redis'); 

file2.js

var redis = require('./redis'); 

哪種方法更好:在每一個新的文件,我介紹創建新的Redis實例(情況A )或者全局創建一個Redis連接(場景B)並共享此連接遍及我所有的模塊。每種解決方案的缺點/好處是什麼?

在此先感謝!

+0

也許連接池會給你兩種情況? – akonsu

+0

@akonsu你可以舉一個連接池 – PirateApp

回答

1

Node和Redis都可以很好地處理很多連接,所以這不是問題。

在您的情況下,您在應用程序啓動時創建了Redis連接,因此您設置的連接數量有限(從應用程序啓動後的連接數量不變)。

您希望重複使用相同連接的情況處於高度動態的情況下,例如使用HTTP服務器,您需要爲每個請求查詢Redis。爲每個請求創建一個新的連接會浪費資源(始終創建和銷燬連接),並且爲每個請求重用一個連接將會更可取。

至於哪兩個我更喜歡,我傾向於情景A自己。

+0

的例子,這是一個很好的觀點,但如果你將節點實例擴展到10個實例運行,並且每個實例有2個連接,那麼你正在創建20個連接,方法A效率低下縮放 – PirateApp

+1

@PirateApp假設所有這些連接都將被使用,爲什麼它效率低下? :) – robertklep

+0

這就是爲什麼:) https://medium.com/@stockholmux/managing-modularity-and-redis-connections-in-node-js-eb9232f8c1ba – PirateApp

3

當我面對這樣的問題時,我通常會考慮三個基本問題。

  1. 哪個更具可讀性?
  2. 哪個允許更好的代碼重用?
  3. 哪種效率更高?

不一定,因爲它取決於具體的方案,但我相信在這種情況下,所有這三個問題都贊成選項B. 的如果你需要修改createClient選項,你會那麼這個順序需要在每個使用它的文件中編輯它們。選項A中的哪一個是使用redis的每個文件,而選項B只是redis.js。另外,如果有更新的或不同的產品出現,並且您想要替換redis,則可以將redis.js作爲另一個包或甚至更新的redis客戶端的封裝器,從而大大縮短轉換時間。

全局變量通常是一件壞事,但在這個例子中,redis.js不應該存儲可變狀態,所以在這種情況下沒有全局/單例的問題。