相對於多執行緒而言,可以說 redis 是單執行緒,但是這種說法也是不太準確的。為什麼呢?下面來分析一下:
一、redis 單執行緒到底指什麼?
沒錯,大家所熟知的 redis 確實是單執行緒模型,指的是執行 redis 命令的核心模組是單執行緒的,而不是整個 redis 例項就是乙個執行緒,redis 其他模組還是有各自模組的執行緒的。
下面這個解釋比較好:
redis 基於 reactor 模型開發了網路事件處理器,這個處理器被稱為檔案事件處理器。它的組成結構為4部分:多個套接字、io 多路復用程式、檔案事件分派器、事件處理器。
因為檔案事件分派器佇列的消費是單執行緒的,所以 redis 才叫單執行緒模型。
二、redis 不僅僅是單執行緒
一般來說,redis 的瓶頸並不在 cpu,而在記憶體和網路。如果要使用 cpu 多核,可以搭建多個 redis 來解決。
其實,redis 4.0 開始就有多執行緒的概念了,比如 redis 通過多執行緒方式在後台刪除物件,以及通過 redis 模組實現的阻塞命令等。
另外,前段時間 redis 6 正式發布了,其中有乙個是被說了很久的多執行緒 io :
這個 threaded i / o 指的是在網路 io 處理方面上了多執行緒,如網路資料的讀寫和協議解析等,需要注意的是,執行命令的核心模組還是單執行緒的。
三、為什麼網路處理要引入多執行緒?
上面的段落說了,redis 的瓶頸並不在 cpu,而在記憶體和網路。
記憶體不夠的話,可以加記憶體或者做資料結構優化和其他優化等,但網路的效能優化才是大頭,網路 io 的讀寫在 redis 整個執行期間,占用了大部分的 cpu 時間,如果把網路處理這部分做成多執行緒處理方式,那對整個 redis 的效能會有很大的提公升。
網上也有對 redis 單 / 多 執行緒情況下的 get / set 操作效能做了對比:
但是可以知道的是,redis 6.0 在網路處理方面上了多執行緒確實會讓 redis 效能上乙個台階,不過 redis 6.0 發布還沒多久,應該不會有很多企業馬上上生產環境,可能還需要一段時間的優化和驗證,我們再期待吧。
最後,目前最新的 6.0 版本中,io 多執行緒處理模式預設是不開啟的,需要去配置檔案中開啟並配置執行緒數,有興趣的研究下吧。
Redis是多執行緒還是單執行緒?
沒錯,大家所熟知的 redis 確實是單執行緒模型,指的是執行 redis 命令的核心模組是單執行緒的,而不是整個 redis 例項就乙個執行緒,redis 其他模組還有各自模組的執行緒的。下面這個解釋比較好 一般來說 redis 的瓶頸並不在 cpu,而在記憶體和網路。如果要使用 cpu 多核,可...
Redis是單執行緒還是多執行緒
準確一點來講,既不是單執行緒,也不是多執行緒。io執行緒 記憶體處理執行緒 服務端和客戶端建立 socket 連線,並分配處理執行緒 首先,主線程負責接收建立連線請求。當有客戶端請求和例項建立 socket 連線時,主線程會建立和客戶端的連線,並把 socket 放入全域性等待佇列中。緊接著,主線程...
redis單執行緒還是多執行緒
redis 是單執行緒模型,指的是執行 redis 命令的核心模組是單執行緒的,而不是整個 redis 例項就乙個執行緒,redis 其他模組還有各自模組的執行緒的。redis基於reactor模式開發了網路事件處理器,這個處理器被稱為檔案事件處理器。它的組成結構為4部分 多個套接字 io多路復用程...