1. 程式人生 > >Redis單線程原理

Redis單線程原理

數據返回 建立連接 等待 服務 就是 線程 不能 nbsp 數據處理

redis是以socket方式通信,socket服務端可同時接受多個客戶端請求連接,也就是說,redis服務同時面對多個redis客戶端連接請求,而redis服務本身是單線程運行。

假設,現在有A,B,C,D,E五個客戶端同時發起redis請求,A優先稍微一點點第一個到達,然後是B,C,D,E依次到達,此時redis服務端開始處理A請求,建立連接需要30秒,獲取請求數據需要10秒,然後處理數據需要0.1秒,回送數據給客戶端需要5秒,總共大概需要45秒。也就是說,下一個B請求需要等待45秒,這裏註意,也許這五個幾乎同時請求,由於socket可以同時處理多個請求,所以建立網絡連接階段時間差可忽略,但是在第二階段,服務端需要什麽事都不幹,坐等10秒中,對於CPU和客戶端來說是無法忍受的。所以說單線程效率非常,非常低,但是正是因為這些類似問題,Redis單線程本質上並不是如此運行。接下來討論redis真正的單線程運行方式。

客戶端與服務端建立連接交由socket,可以同時建立多個連接(這裏應該是多線程/多進程),建立的連接redis是知道的(為什麽知道,去看socket編程,再次強調基礎很重要),然後redis會基於這些建立的連接去探測哪個連接已經接收完了客戶端的請求數據(註意:不是探測哪個連接建立好了,而是探測哪個接收完了請求數據),而且這裏的探測動作就是單線程的開始,一旦探測到則基於接收到的數據開始數據處理階段,然後返回數據,再繼續探測下一個已經接收完請求數據的網絡連接。註意,從探測到數據處理再到數據返回,全程單線程。這應該就是所謂的redis單線程。至於內部有多復雜我們無需關心,我們追求的是理解流程,苛求原理,但不能把內臟都挖出來。


Redis單線程原理