如何理解redis單執行緒

2022-10-09 10:42:10 字數 1016 閱讀 4186

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分客戶端和服務端,一次完整的redis請求事件有多個階段 客戶端到伺服器的網路連線 redis讀寫事件發生 redis服務端的資料處理 單執行緒 資...

Redis單執行緒

redis 的單執行緒主要是指 redis 的網路 io 和鍵值對讀寫是由乙個執行緒來完成的,這也是 redis 對外提供鍵值儲存服務的主要流程。當多個客戶端發起命令,這些命令併發執行時,在redis內部,會排隊逐個執行,也就是執行命令的那個操作是由乙個執行緒執行的。但 redis 的其他功能,比如...

redis單執行緒模型

redis基於reactor模式開發了自己的網路事件處理器,稱之為檔案事件處理器 file event hanlder 檔案事件處理器由socket io多路復用程式 檔案事件分派器 dispather 事件處理器 handler 四部分組成。io多路復用程式會同時監聽多個socket,當被監聽的s...