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

node之中鏈接redis使用的redis模塊,雖然好用,可是有些地方仍是須要注意。node

npm install redisredis

 

redis client 行爲:
一、客戶端執行過程當中斷網的狀況
  因爲本來鏈接正常,斷網後socket沒法主動檢測到,所以TCP進入不斷的重傳,ubuntu系統大概在1000秒左右返回ETIMEOUT。
  因爲redis客戶端沒有等待回覆超時時間,因此會等待到TCP超時才最終致使超時。
二、重鏈接機制:當服務端異常斷開會致使重鏈接,而如果客戶端主動斷開則不會重鏈接
  以下兩種狀況表示客戶端主動斷開:
    1)向服務端發送quit命令
    2)調用客戶端類的end函數
  重鏈接選項:
    max_attempts:重試次數,默認無限制
    retry_max_delay:兩次重鏈接之間有一個延遲,默認按照指數避退原則不斷增長,這個數值設置延遲的最大值
    connect_timeout:鏈接的超時時間(包括重鏈接),也就是若設置這個參數,達到這個值後就不會重鏈接(在這個時間內會按照重鏈接規則進行屢次嘗試,直到時間用盡)
三、設置client.stream.setTimeout這種方式,對於不斷向服務器發送命令的應用無效
  由於sock的timeout表示空閒超時,只有在發送與接收都沒有數據時才計入空閒時間,
  而因爲應用不斷向服務端發送命令,也就是在發送上是處於忙狀態,不能記錄爲空閒。npm

四、關於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在被關閉時觸發,所以只要不是極端的清除全部的註冊事件,均可以收到該事件通知。
五、關於redisClient的命令隊列與離線隊列
  命令隊列offline_queue:
  當前鏈接可用時客戶端會將命令不斷髮出去,每出去一個在隊列末尾添加一項,收到一個回覆從隊列頭部刪除一項。所以當應用使用多個鏈接時可能會出現,A鏈接執行set命令,B鏈接去查詢爲空,那是因爲A鏈接上的set命令還在隊列裏等待redis執行。
  長度查詢:client.command_queue.length
  離線隊列offline_queue:
  當前鏈接不可用時,客戶端會將命令放置到離線隊列之中,同時重鏈接規則嘗試鏈接服務器,每次嘗試失敗都會清空離線隊列。
  長度查詢:client.offline_queue.length
  可以使用enable_offline_queue:false選項關閉該功能。
六、錯誤時的回調
  若在執行命令中設置了回調函數,當有異常時這個回調會先被調用,而後觸發error事件。ubuntu

相關文章
相關標籤/搜索