Redis的IO模型以及客戶端與服務端設計

IO模型–事件驅動

Redis服務器是一個事件驅動程序,服務器需要處理一下兩類

  • 文件事件:Redis服務器通過套接字與客戶端(或者其他Redis服務器)進行連接,而文件事件就是服務器對套接字操作的抽象。服務器與客戶端的通信會產生相應的文件事件,而服務器則通過監聽並處理這些事件來完成一系列的網絡通信操作
  • 時間事件:Redis服務器中的一些操作(比如serverCron函數)需要在給定的時間點執行,而時間事件就是服務器這類定時操作的抽象

文件事件(通常是與客戶端的交互)

Redis基於Reactor模式開發了自己的網絡事件處理器:這個處理器被稱爲文件事件處理器

  • 文件事件處理器使用I/O多路複用程序來通時監聽多個套接字,並根據套接字目前執行的任務來爲套接字關聯不同的事件處理器
  • 當被監聽的套接字準備好執行連接應答,讀取,寫入,關閉等操作時,與操作相對應的文件事件就會產生。這時文件事件處理器就會調用套接字之前關聯號的事件處理器來處理這些事件

雖然文件事件處理器以單線程方式運行,但通過使用I/o多路複用程序來監聽多個套接字,文件事件處理器即實現了高性能的網絡通信模型,又可以很好的與Redis服務器中其他同樣以單線程方式運行的模塊進行對接,這保持了Redis內部單線程設計的簡單性

在這裏插入圖片描述

  • 文件事件是對套接字操作的抽象,每當一個套接字準備好執行連接應答(accept)、寫入、讀取、關閉等操作時,就會產生一個文件事件,因爲一個服務器通常會連接多個套接字,所以多個文件事件有可能併發的出現
  • IO多路複用程序負責監聽多個套接字,並向文件事件分派器傳送那些產生了事件的套接字
  • 文件事件分派器接受IO多路複用程序傳來的套接字,並根據套接字產生的事件類型,調用相應的事件處理器

文件事件的處理器

Redis爲文件事件編寫了多個處理器,這些事件處理器分別用於實現不同的網絡通信需求,比如說:

  • 爲了對連接服務器的各個客戶端進行應答,服務器要爲監聽套接字關聯連接應答處理器
  • 爲了接受客戶端傳來的請求命令,服務器要爲客戶端套接字關聯命令請求處理器你
  • 爲了向客戶端返回命令的執行結果,服務器要爲客戶單套接字關聯命令回覆處理器
  • 當主服務器和從服務器進行復制操作時,主從服務器都需要關聯特別爲複製功能編寫的複製處理器

在這裏插入圖片描述

時間事件(服務器的自身觸發的一些維護操作)

分類

在這裏插入圖片描述

底層實現

服務器將所有時間都放到一個無序鏈表中,每當時間事件執行器運行時,它就遍歷整個鏈表,查找所有已到達的事件,並調用相應的事件處理器。

在這裏插入圖片描述

時間事件應用實例:serverCron函數

持續運行的Redis服務器需要定期對自身的資源和狀態濟寧檢查和調整,從而確保服務器可以長期,穩定的運行,這些操作由serverCron函數執行,它的工作主要包括

  • 更新服務器的各類統計信息,比如時間、內存佔用,數據庫佔用情況等。
  • 清裏數據庫中的過期鍵值對
  • 關閉和清理連接失效的客戶端
  • 嘗試進行AOF或RDB持久化操作
  • 如果服務器是主服務器,那麼對從服務器進行定期同步
  • 如果處於集羣模式,對集羣進行定期同步和聯結測試

Redis服務器以週期性事件的方式來運行serverCron函數,在服務器運行期間,每個一段時間,serverCron就會執行一次,直到服務器關閉爲止

事件的調度與執行

因爲服務器同時存在文件事件和時間事件兩種事件類型,所以服務器必須對這兩種事件進行調度,何時對它們進行調度
在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述

客戶端–如何設計

在這裏插入圖片描述

  • Redis服務器是典型的一對多服務器程序:一個服務器可以與多個客戶端建立網絡連接,每個客戶端可以向服務器發送命令請求,而服務器則接受並處理客戶發送的命令請求,並向客戶daunt返回命令回覆
  • 通過使用由I/O多路複用技術實現文件事件處理器,Redis使用單線程單進程的方式處理命令請求,並與多個客戶端進行網絡通信
  • 對於每個與服務器進行連接客戶頓,服務器都爲這些客戶端建立相應的redisClient結構,這個結構保存了客戶端當前的狀態信息,以及執行相關功能時需要用到的數據結構
    在這裏插入圖片描述

客戶端底層的數據結構

在這裏插入圖片描述

在服務端保存了一個維持客戶端的信息,以鏈表的方式進行存儲

在這裏插入圖片描述

  • 套接字描述符:
  • 名字:客戶端的名字
  • 標誌:客戶端的角色
  • 輸入緩衝區:保存客戶端發送的命令請求
  • 命令與命令參數:在服務器將客戶端發送的命令請求保存到客戶端狀態的輸入緩衝區之後,服務器將對命令請求的內容進行分析,並將得到的命令參數以及命令參數的個數分別保存到客戶端狀態的arg屬性和argc屬性
  • 命令的實現函數:當服務器從協議內容中分析並得出argv屬性和argc屬性的值之後,服務器將根據項的argv[0]的值,在命令表中查找命令所對應的命令實現函數
  • 在這裏插入圖片描述
  • 輸出緩衝區:執行命令所得到的的命令回覆會被保存在客戶狀態的輸出緩衝區裏面,每個客戶單都有兩個輸出緩衝區可用,一個緩衝區的大小是固定的,另一個緩衝區大小是可變的
  • 身份驗證:用於記錄了客戶端是否通過了身份驗證
  • 時間:

    • 創建客戶單的時間
    • 客戶端與服務器最後一次進行互動的時間

客戶端的創建與關閉

客戶端的創建

如果客戶端是通過網絡連接與服務器進行連接的普通客戶端,那麼在客戶端使用connect函數連接到服務器時,服務器就會調用連接事件處理器,爲客戶端創建相應的客戶端狀態,並將這個新的客戶端狀態添加到服務器狀態結構clients鏈表的末尾。

AOF文件的僞客戶端

服務器在載入AOF文件時,會創建用於執行AOF文件包含的`Redis命令的僞客戶端,並在載入完成之後,關閉這個僞客戶端。

客戶端的關閉

在這裏插入圖片描述

服務器

Redis服務器負責與多個客戶端建立網絡連接,處理客戶端發送的命令請求,在數據庫中保存客戶端執行命令所產生的數據,並通過資源管理來維持服務器自身的運轉

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