本系列主要是為了對redis的網路模型和叢集原理進行學習,我會用golang實現一個reactor網路模型,並實現對redis協定的解析。
系列原始碼已經上傳github
https://github.com/HobbyBear/tinyredis/tree/chapter2
在介紹redis網路模型前,我們先來看看redis的一條命令執行涉及到哪些階段。
從連線讀取資料 => 協定解析 => 命令執行 => 將結果返回給使用者端
而平時我們說的redis的單執行緒指的則是 命令執行階段是單執行緒的,而redis6.0以後協定解析和返回結果給使用者端都可以是多執行緒去進行處理。
由此衍生出redis6.0的網路模型如下:
主執行緒通過一個epoll範例負責監聽連線和等待資料的到達,並且執行解析好的命令。
舉個例子,當主執行緒執行epoll wait時發現有100個socket可讀,並且這100個socket都是已經完成連線建立的socket,然後主執行緒就會把這100個socket分給子執行緒去進行讀取, 當子執行緒將這些socket的 位元組資料解析成redis命令後,會再把這些命令交再給主執行緒去執行。主執行緒執行完以後又將這些命令執行結果交給子執行緒去進行傳送。
整個過程可以看到實際的網路io的讀取是交給多個執行緒去執行了,但是命令的執行還是在一個執行緒完成的。
再用流程圖去表示整個過程將會更加清晰,
可以看見,整個過程中命令執行是在主執行緒去順序執行的。而現在我們就是要用golang去實現這樣一個模型。