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事件。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM