簡介
? ? ? ? 在談及Redis為什么快的時候,很多人都只能回答redis是基于內存,所以快。但他們往往不知道,決定redis快的因素,還有它的IO模型-Reactor模型。談及Redis的IO模型之前,先補充一下IO模型的基礎知識。
IO模型演化
? ? ? ? 1.堵塞IO
????????指線程會一直阻塞等待網卡數據準備就緒,直到完成數據讀寫完成。由此可以看出來,在獲取到數據之前,會一直等待。這種模式極其浪費資源,效率低下。
? ? ? ? 2.非堵塞IO
? ? ? ? ?指線程獲取數據時,當發現數據沒有準備就緒時,直接返回,不會等待。應用層持續輪詢,直到獲取這個數據。
????????
????????可以看出來,堵塞IO和非堵塞IO都是需要啟動一個線程主動獲取數據,是一種同步調用的行為。有沒有異步通知的機制呢?
? ? ? ? 3.時間驅動模型
????????以事件為連接點,當有IO事件準備就緒時,以事件的形式通知相關線程進行數據讀寫,進而業務線程可以直接處理這些數據,這一過程的后續操作方,都是被動接收通知.它是一種通知機制,而不需要啟線程自己主動去獲取。大大減少了資源的浪費。
????????4.Reactor模型
1.Reactor 對象通過 select (IO 多路復用接口) 監聽事件,收到事件后通過 dispatch 進行分發,具體分發給 Acceptor 對象還是 Handler 對象,還要看收到的事件類型
2.如果是連接建立的事件,則交由 Acceptor 對象進行處理,Acceptor 對象會通過 accept 方法 獲取連接,并創建一個 Handler 對象來處理后續的響應事件;
3.如果不是連接建立事件, 則交由當前連接對應的 Handler 對象來進行響應
核心流程概括:1.select監聽 2.dispatch分發 3.handle處理
????????總結:Redis就是參考了Reactor模型,實現了異步監聽+請求分發機制,進而提高了處理性能。Reactor模型在Kafka通信中也有體現,例如在Kafka專欄的這一節里,介紹了Kafka處理請求的模式:八、Kafka的請求是如何處理的-CSDN博客?。當然除了Kafka、很多高性能的中間件例如Netty也實現了Reactor模型
參考:高性能網絡編程之 Reactor 網絡模型(徹底搞懂)_reactor網絡模型-CSDN博客
參考:9.3 高性能網絡模式:Reactor 和 Proactor | 小林coding