node-redis模塊需要注意的事項

node之中連接redis使用的redis模塊,雖然好用,但是有些地方還是需要注意。

npm install redis

redis client 行爲:

1、客戶端執行過程中斷網的情況

  由於原本連接正常,斷網後socket無法主動檢測到,因此TCP進入不斷的重傳,ubuntu系統大概在1000秒左右返回ETIMEOUT。
  由於redis客戶端沒有等待回覆超時時間,所以會等待到TCP超時才最終導致超時。

2、重連接機制:當服務端異常斷開會導致重連接,而若是客戶端主動斷開則不會重連接

  如下兩種情況表示客戶端主動斷開:
    1)向服務端發送quit命令
    2)調用客戶端類的end函數
  重連接選項:
    max_attempts:重試次數,默認無限制
    retry_max_delay:兩次重連接之間有一個延遲,默認按照指數避退原則不斷增加,這個數值設置延遲的最大值
    connect_timeout:連接的超時時間(包括重連接),也就是若設置這個參數,達到這個值後就不會重連接(在這個時間內會按照重連接規則進行多次嘗試,直到時間用盡)

3、設置client.stream.setTimeout這種方式,對於不斷向服務器發送命令的應用無效

  因爲sock的timeout表示空閒超時,只有在發送與接收都沒有數據時才計入空閒時間,
  而由於應用不斷向服務端發送命令,也就是在發送上是處於忙狀態,不能記錄爲空閒。

4、關於end事件

  使用redisClient.quit()向服務端發送quit命令,服務端關閉連接,redis客戶端能夠收到end事件通知。
  使用redisClient.end()函數主動關閉連接時,redis客戶端不會收到end事件通知。
  原因:
    redisClient.end()函數體中有一條語句
    this.stream._events = {}; //將socket連接上註冊的所有事件清空
    由於redisClient上的事件是基於socket事件的,當socket事件清空後,redisClient本身也就無法觸發任何事件了。
    延伸:socket的end事件觸發時機:當讀取到一個EOF時觸發,因此若沒有註冊data事件(監控數據可讀),也就不會有end事件。
    socket的close在被關閉時觸發,因此只要不是極端的清除所有的註冊事件,都可以收到該事件通知。

5、關於redisClient的命令隊列與離線隊列

  命令隊列offline_queue:
  當前連接可用時客戶端會將命令不斷發出去,每出去一個在隊列末尾添加一項,收到一個回覆從隊列頭部刪除一項。因此當應用使用多個連接時可能會出現,A連接執行set命令,B連接去查詢爲空,那是由於A連接上的set命令還在隊列裏等待redis執行。
  長度查詢:client.command_queue.length
  離線隊列offline_queue:
  當前連接不可用時,客戶端會將命令放置到離線隊列之中,同時重連接規則嘗試連接服務器,每次嘗試失敗都會清空離線隊列。
  長度查詢:client.offline_queue.length
  可使用enable_offline_queue:false選項關閉該功能。
6、錯誤時的回調
  若在執行命令中設置了回調函數,當有異常時這個回調會先被調用,然後觸發error事件。

發佈了4 篇原創文章 · 獲贊 5 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章