搜尋

首頁  >  問答  >  主體

node 使用 redis 來快取數據,需要每次請求都建立連結嗎?

目的:使用redis來快取網站的固定內容資料在node開啟的時候

遇到的問題:

var redis = require('redis'),
    client = redis.createClient();
    
client.hset([hash, hashtest, value],function(err,reply){
               callback(err,reply);
               // client.quit();
});

client.hget([hash,hashtest],function(err,reply){
               callback(err,reply);
               // client.quit();
})

每次在請求完成以後是否需要client.quit 關閉鏈接,然後在請求的時候再次createClient 鏈接呢? ?

PHP中文网PHP中文网2796 天前796

全部回覆(3)我來回復

  • 阿神

    阿神2017-04-24 09:13:02

    在設定檔中有兩個設定與此相關:
    maxclients用來設定支援的最大客戶端連接,超過了就拒絕;這來設定你的redis客戶端能夠同時支援多少連接;(當然,除了這個值,還需要看linux系統的limit設定)
    timeout 超時設置,用來設定一個用戶連接之後,多長之內沒有觸發redis請求,就從伺服器端主動關閉這個連接,以節省系統資源;

    # Set the max number of connected clients at the same time. By default
    # this limit is set to 10000 clients, however if the Redis server is not
    # able to configure the process file limit to allow for the specified limit
    # the max number of allowed clients is set to the current file limit
    # minus 32 (as Redis reserves a few file descriptors for internal uses).
    #
    # Once the limit is reached Redis will close all the new connections sending
    # an error 'max number of clients reached'.
    #
    # maxclients 10000
    
    # Set the max number of connected clients at the same time. By default
    # this limit is set to 10000 clients, however if the Redis server is not
    # able to configure the process file limit to allow for the specified limit
    # the max number of allowed clients is set to the current file limit
    # minus 32 (as Redis reserves a few file descriptors for internal uses).
    #
    # Once the limit is reached Redis will close all the new connections sending
    # an error 'max number of clients reached'.
    #
    # maxclients 10000
    # Close the connection after a client is idle for N seconds (0 to disable)
    timeout 0
    

    對於redis的連線要求,一般有以下兩種場景設定:

    1. 觸發用戶請求的server有限(例如100個以內),這就可以將timeout 設為0,這樣redis連線請求永遠有效,連線一次後不再斷開;只在服務重新啟動或出錯後重連;

    2. 大量用戶數並發請求,這種情況,可以將timeout 設定在幾分鐘之內(根據業務來確定),而客戶端連接以後後不主動關閉連接,在發現連接被關閉(由於超時被伺服器關閉)後再請求連線;

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-24 09:13:02

    好像自備連接池吧

    回覆
    0
  • 阿神

    阿神2017-04-24 09:13:02

    不建議每個請求都重新連接一次。只會浪費建立連結所花費的時間。比較好的是在每個model建立一次連結(createClient)後一直保持著就好了。因為redis單執行緒處理的特性,所以連線池本身對redis是沒什麼用處的。

    回覆
    0
  • 取消回覆