Redis基於Reactor模式開發了自己的網絡事件處理器。被稱為文件事件處理器,由於這個處理器是單線程的所以決定了redis是單線程的。
Redis線程模型的組成:
- 多個socket
- IO多路復用程序
- scocket隊列
- 文件事件分配器
- 事件處理器(連接應答處理器,命令請求處理器,命令回復處理器)
多個 socket 可能會並發產生不同的操作,每個操作對應不同的文件事件,但是 IO 多路復用程序會監聽多個 socket,會將 socket 產生的事件放入隊列中排隊,事件分派器每次從隊列中取出一個事件,把該事件交給對應的事件處理器進行處理。
Redis線程模型的流程及原理
如下圖客戶端和redis的一次通信:
1、客戶端socket01請求redis的server scoket建立連接,此時server socket生成AE_READABLE事件,IO多路復用程序監聽到server socket產生的事件,並將該事件壓入隊列。
文件事件分派器從隊列中拉取事件交給連接應答處理器,處理器同時生成一個與客戶端通信的socket01,並將該scoket01的AE_READABLE事件與命令請求處理器關聯
2、此時客戶端scoket01發送一個set key value的請求,redis的scoket01接收到AE_READABLE事件,IO多路復用程序監聽到事件,將事件壓入隊列,文件分派器取到事件,由於scoket01已經
和命令請求處理器關聯,所以命令請求處理器開始set key value,完畢后會將redis的scoket01的AE_WAITABLE事件關聯到命令回復處理器
3、如果此時客戶端准備好接收返回結果了,向redis中的socket01發起詢問請求,那么 redis 中的 socket01 會產生一個 AE_WRITABLE
事件,同樣壓入隊列中,事件分派器找到相關聯的命令回復處理器,由命令回復處理器對 socket01 輸入本次操作的一個結果,比如 ok
,之后解除 socket01 的 AE_WRITABLE
事件與命令回復處理器的關聯。
這樣便完成了redis的一次通信。
通過上述線程模型講述,進一步了解redis中的事務,之前說事務和命令都是一組最小的執行單元,事務應該是該客戶端將一組命令發送給redis,redis將一組命令壓入隊列,命令請求處理器一起處理
不會中斷。
在redis實現分布式鎖時說過,會發生並發問題,當客戶端A執行1,2操作,客戶端B執行3,4操作,並發執行時,在redis中的隊列狀況可能是 1,3,4,2 / 3,4,1,2 等多種情況,所以會引起並發問題。