Redis技術知識總結之二——Redis線程模型

接上篇《Redis技術知識總結之一——Redis 的數據結構》

二. Redis 線程模型

參考地址:
《Redis線程模型》
《Redis線程模型》簡書

redis 內部使用文件事件處理器 (File Event Handler),這個文件事件處理器是單線程的,所以 redis 才叫做單線程的模型。它採用 IO 多路複用機制,同時監聽多個 socket,根據被監聽 socket 上的事件(如連接應答 accept、讀取 read、寫入 write、關閉 close)等操作時,與操作相對應的事件就會產生,這時文件事件處理器就會調用套接字之前關聯好的事件處理器來處理這些事件。
文件事件處理器由四部分組成,如下圖所示:
文件事件處理器組成

  • 套接字
  • IO 多路複用程序
  • 文件事件分發器
  • 事件處理器
    • 事件處理器包括各種類型,如命令請求處理器、命令響應處理器、連接應答處理器、複製處理器等;

多個 socket 可能會併發產生不同的操作,每個操作對應不同的事件,但是 IO 多路複用程序會監聽多個 socket,會將 socket 產生的事件放入隊列中排隊,事件分派器每次從隊列中取出一個事件,然後通過這個隊列, 以有序、同步、且每次一個套接字的方式向文件事件分派器傳送套接字。當上一個套接字產生的事件被處理完畢之後(該套接字爲事件所關聯的事件處理器執行完畢), I/O 多路複用程序纔會繼續向事件分派器傳送下一個套接字。如圖所示:
Redis多路複用隊列

客戶端與 redis 服務器的一次通信過程如下:

  1. 客戶端向 Redis Server 的 socket 請求建立連接,此時 server socket 會產生一個 AE_READABLE 事件;
  2. Redis Server 的 IO 多路複用程序監聽到 server socket 產生的事件後,將該事件壓入隊列中;
  3. 文件事件分派器從隊列中獲取該事件,交給連接應答處理器;
  4. 連接應答處理器會創建一個能與客戶端通信的 socket01,並將該 socket01 的 AE_READABLE 事件與命令請求處理器關聯;
  5. 假設此時客戶端發送了一個 set key value 請求,此時 redis 中的 socket01 會產生 AE_READABLE 事件,IO 多路複用程序將事件壓入隊列;
  6. 事件分派器從隊列中獲取到該事件,由於前面 socket01 的 AE_READABLE 事件已經與命令請求處理器關聯,因此事件分派器將事件交給命令請求處理器來處理;
  7. 命令請求處理器讀取 socket01 的 key value,並在自己內存中完成 key value 的設置;
  8. 操作完成後,它會將 socket01 的 AE_WRITABLE 事件與命令回覆處理器關聯。
  9. 如果此時客戶端準備好接收返回結果了,那麼 redis 中的 socket01 會產生一個 AE_WRITABLE 事件,同樣壓入隊列中;
  10. 事件分派器找到相關聯的命令回覆處理器,由命令回覆處理器對 socket01 輸入本次操作的一個結果,比如 ok,之後解除 socket01 的 AE_WRITABLE 事件與命令回覆處理器的關聯。

由上面完成了一次通信的過程可以看出,Redis 效率高的原因在於一是純內存操作,二是核心是基於非阻塞的 IO 多路複用機制,此外,單線程反而避免了多線程的頻繁上下文切換問題。

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