redis為什麼可以支援高并發和它内部的工作模式有不可分割的關系:
- 絕大部分請求是純粹的記憶體操作(非常快速)
- 采用單線程,避免了不必要的上下文切換和競争條件
- 非阻塞IO - IO多路複用
Redis用戶端對服務端的每次調用都經曆了發送指令,執行指令,傳回結果三個過程。其中執行指令階段,由于Redis是單線程來處理指令的,所有到達服務端的指令都不會立刻執行,所有的指令都會進入一個隊列中,然後逐個執行,并且多個用戶端發送的指令的執行順序是不确定的,但是可以确定的是不會有兩條指令被同時執行,不會産生并發問題,這就是Redis的單線程基本模型。
檔案事件處理器結構包含5個部分,其實真正包含為4個部分(不包含socket隊列,加上主要友善後面了解):多個socket、IO多路複用程式、socket隊列、檔案事件分派器、以及事件處理器。如圖:

注:如果隻是單純的單線程,那麼redis在每一次的IO處理上都會耗費很長的時間,但是redis這裡使用了IO多路複用監聽多個socket,哪個socket接收完成了請求的IO,就将這個scoket塞入socket隊列,這樣就大大減少了IO處理的時間。
如圖可以看出
- 用戶端請求過來,到了IO多路複用
- 監聽到接收請求完成的socket,放入隊列供檔案事件分派器消費(這個過程是單線程的)
- 檔案事件分派器在選擇對應的事件處理器進行處理
這裡隻是簡單解讀了redis的内部工作模式,具體的多路複用原理大家需要了解可以自行了解。
但是這裡得說明下redis這裡主流程雖然是單線程,但并不代表redis任何時候都是單線程的,比如我們之前講的redis持久化操作,就會啟用一個子線程進行持久化操作,這種操作還存在很多場景,是以redis的單線程指的是redis的主流程單線程,既我們上述所講的過程。
另外redis6.0好像也要引入上述主流程的多線程操作,因為在面試的時候被問到redis是單線程還是多線程時不能一口咬定就是單線程。