文章目錄
- 復習 Redis Day4:線程模型
- 介紹一下 Redis 的線程模型
- 核心線程模型(Redis 6.0 之前)
- Redis 6.0+ 的多線程改進
- Redis 真的是單線程嗎?
- Redis 的線程模型剖析
上一篇 Redis 的應用我今天才完成,因此明天一并復習 Redis 的應用和線程模型,今天我們直接學習 Redis 線程模型。
復習 Redis Day4:線程模型
介紹一下 Redis 的線程模型
Redis 的線程模式是其高性能的核心設計之一,其核心思想是「單線程處理命令 + 多線程輔助執行特定任務」。在 Redis 6.0 之前,單線程是 Redis 的核心線程模型,在 Redis 6.0 之后引入了多線程進行輔助。
核心線程模型(Redis 6.0 之前)
1. 單線程處理所有命令
主線程職責
- 接收客戶端請求(網絡 I/O);
- 解析命令、執行數據操作(如讀寫內存);
- 返回響應結果。
單線程優勢
- 避免鎖競爭:無需處理多線程并發問題;
- 順序執行:所有命令順序執行,天然避免競態條件;
- 高效內存訪問:單線程可充分利用 CPU 緩存局部性;
2. 多線程輔助任務
- 后臺持久化:RDB 快照與 AOF 重寫啟用子進程來完成;
- 異步刪除大 key:通過
UNLINK
命令(非阻塞刪除)觸發后臺線程清理。
Redis 6.0+ 的多線程改進
Redis 6.0 引入了「多線程網絡 I/O」,但命令執行仍然為單線程,其核心改進如下:
1. 多線程網絡 I/O
- 主線程:負責監聽和分發客戶端連接請求;
- I/O 線程池:負責處理 socket 讀寫(解析請求和發送響應)。默認關閉,需要通過配置
io-threads N
啟用。命令的執行仍然由主線程單線程處理,保證操作的原子性; - 性能提升:高并發場景下,網絡 I/O 多線程可顯著提升吞吐量。
2. 典型工作流
- 主線程接收新的連接請求,將連接的 Socket 分發給 I/O 線程;
- I/O 線程讀取請求并解析命令,將命令放入隊列;
- 主線程從隊列拉取命令,單線程執行并生成響應;
- I/O 線程將響應寫回客戶端。
Redis 真的是單線程嗎?
這個問題我把它當作一個「子問題」放在 Redis 線程模型簡述之下。Redis 在執行命令時確實是單線程,在 Redis 6.0 之后引入的多線程也只是為了并發地處理多路網絡 I/O 請求,在執行命令時仍然是單線程。
Redis 的線程模型剖析
Redis 內部使用一個「文件事件處理器(File Event Handler)」,它是單線程的,所以 Redis 才被稱作單線程模型。文件事件處理器采用 IO 多路復用機制監聽多個 socket,將產生事件的 socket 壓入內存隊列中,事件分派器根據 socket 上的事件來選的對應的事件處理器進行處理。
文件事件處理器的結構如下:
- 多個 socket;
- IO 多路復用;
- 文件事件分派器;
- 事件處理器(連接應答處理器、命令請求處理器、命令回復處理器)。