瞭解redis的單線程模型工作原理?一篇文章就夠了

1、首先redis是單線程的,爲什麼redis會是單線程的呢?

  1. 從redis的性能上進行考慮,單線程避免了上下文頻繁切換問題,效率高;
  2. 從redis的內部結構設計原理進行考慮,redis是基於Reactor模式開發了自己的網絡事件處理器: 這個處理器被稱爲文件事件處理器(file event handler)。而這個文件事件處理器是單線程的,所以才叫redis的單線程模型,這也決定了redis是單線程的。

2、聊一聊redis的單線程模型構造部分?

redis單線程模型中最爲核心的就是文件事件處理器

而文件事件處理器結構包含5個部分,其實真正包含爲4個部分(不包含socket隊列,加上主要方便後面理解):多個socket、IO多路複用程序、socket隊列、文件事件分派器、以及事件處理器。而事件處理器又分爲3個部分爲:連接應答處理器、命令請求處理器、命令回覆處理器。如圖:
在這裏插入圖片描述

3、redis單線程模型的大致工作流程及原理

客戶端與redis進行通信大致流程:
1、首先在redis啓動初始化的時候,redis會先將事件處理器中的連接應答處理器和AE_READABLE事件關聯起來;
2、如果客戶端向redis發起連接,會產生AE_READABLE事件(步驟A),產生該事件後會被IO多路複用程序監聽到(步驟B),然後IO多路複用程序會把監聽到的socket信息放入到隊列中(步驟C),事件分配器每次從隊列中取出一個socket(步驟D),然後事件分派器把socket給對應的事件處理器(步驟E)。由於連接應答處理器和AE_READABLE事件在redis初始化的時候已經關聯起來,所以由連接應答處理器來處理跟客戶端建立連接,然後通過ServerSocket創建一個與客戶端一對一對應的socket,如叫socket01,同時將這個socket01的AE_READABLE事件和命令請求處理器關聯起來。
在這裏插入圖片描述
4、當客戶端向redis發生請求時(讀、寫操作),首先就會在對應的socket如socket01上會產生AE_READABLE事件(步驟A),產生該事件後會被IO多路複用程序監聽到(步驟B),然後IO多路複用程序會把監聽到的socket信息放入到隊列中(步驟C),事件分配器每次從隊列中取出一個socket(步驟D),然後事件分派器把socket給對應的事件處理器(步驟E)。由於命令處理器和socket01的AE_READABLE事件關聯起來了,然後對應的命令請求處理器來處理。這個命令請求處理器會從事件分配器傳遞過來的socket01上讀取相關的數據,如何執行相應的讀寫處理。操作執行完之後,redis就會將準備好相應的響應數據(如你在redis客戶端輸入 set a 123回車時會看到響應ok),並將socket01的AE_WRITABLE事件和命令回覆處理器關聯起來。
在這裏插入圖片描述
5、當客戶端會查詢redis是否完成相應的操作,就會在socket01上產生一個AE_WRITABLE事件,會由對應的命令回覆處理器來處理,就是將準備好的相應數據寫入socket01(由於socket連接是雙向的),返回給客戶端,如讀操作,客戶端會顯示ok。
在這裏插入圖片描述
6、如果命令回覆處理器執行完成後,就會刪除這個socket01的AE_WRITABLE事件和命令回覆處理器的關聯。
7、這樣客戶端就和redis進行了一次通信。由於連接應答處理器執行一次就夠了,如果客戶端在次進行操作就會由命令請求處理器來處理,反覆執行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章