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