Redis多線程還是單線程(看這篇就夠了)
Redis單線程
Redis所謂的單線程并不是所有工作都是只有一個線程在執行,而是指Redis的網絡IO和鍵值對讀寫是由一個線程來完成的。
Redis在處理客戶端的請求時包括獲取 (socket 讀)、解析、執行、內容返回 (socket 寫) 等都由一個順序串行的主線程處理。
如下圖所示:
圖片
Redis 的核心網絡模型一直是一個典型的單 Reactor 模型,利用 epoll/select/kqueue 等多路復用技術,在單線程的事件循環中不斷去處理事件。
可以看出Redis對CPU計算力的要求并不迫切,相反單線程機制讓 Redis 內部實現的復雜度大大降低,同時降低了因為上下文切換和資源競爭造成的性能損耗。
Redis 6.0多線程
以上便是 Redis 的核心網絡模型,這個單線程網絡模型一直到 Redis v6.0 才改造成多線程模式。
那既然單線程這么好用,為什么Redis 6.0要引入多線程模式?
很簡單,就是 Redis 的網絡 I/O 瓶頸已經越來越明顯了。
Redis 最初選擇單線程網絡模型的理由是,CPU 通常不會成為性能瓶頸,因此單線程足夠了。
但是,近年來底層網絡硬件性能越來越好,Redis 的性能瓶頸逐漸體現在網絡 I/O 的讀寫上,單個線程處理網絡 I/O 讀寫的速度跟不上底層網絡硬件執行的速度。
圖片
Redis 使用了單線程的 I/O 模型,主要負責處理客戶端請求和執行命令,這意味著 Redis 在處理 I/O 操作時是阻塞的,當有大量的客戶端連接時,可能會導致性能瓶頸。
既然讀寫網絡的 read/write 系統調用占用了Redis 執行期間大部分CPU 時間,那么要想真正做到提速,必須改善網絡IO性能。
所以,Redis6.0 版本之后,Redis 正式在核心網絡模型中引入了多線程,也就是所謂的 I/O threading,至此 Redis 真正擁有了多線程模型。
圖片
Redis 6.0 引入了多線程 I/O 模型,這是為了更好地利用多核 CPU 和提高 I/O 操作的并發性能。
雖然主線程仍然是單線程的,但在處理網絡事件和文件 I/O 操作時,Redis 使用了多個輔助線程來分擔負載。
Redis多線程模型總結
Redis 從 Redis 6.0 開始引入了多線程 I/O 模型,以提高在處理網絡事件和文件 I/O 操作時的性能和并發能力。
多線程 I/O 模型允許 Redis 更好地利用多核 CPU,通過多個輔助線程來分擔負載,提高了并發性能。
主線程仍然是單線程的,但后臺工作線程用于執行 I/O 操作,例如處理客戶端連接、數據讀寫以及持久化操作。
總的來說,Redis 的多線程設計主要用于優化 I/O 操作和提高并發性能,而主要的命令處理仍然由單個線程負責,以確保數據的一致性。
這個設計使得 Redis 在大多數情況下能夠以極高的性能和低延遲響應請求,特別適用于緩存、消息隊列和數據存儲等用途。