redis是以socket方式通信,socket服務端可同時接受多個客戶端請求連接,也就是說,redis服務同時面對多個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單執行緒。 至於內部有多複雜我們無需關心,我們追求的是理解流程,苛求原理,但不能把內臟都挖出來。
從探測到接受完請求資料的網路連接到最終的資料返回,伺服器只需要5.1秒,這個時間是我放大N倍後的數據,實際時間遠遠小於這個,可能是5.1的N萬分之一時間。
為什麼這麼說,因為資料的處理是在本地記憶體中,速度有多快任你想像,最終的回傳資料雖然牽扯到網絡,但是網路連線已經建立,這個速度也是非常非常快的,只是比資料處理階段慢那麼一點點。因此單線程方式在效率上其實並不需要擔心。
更多Redis相關技術文章,請造訪Redis入門教學欄位學習!
以上是如何理解redis單線程的詳細內容。更多資訊請關注PHP中文網其他相關文章!