貝殼面試官:Redis 為什么這么快?過(guò)來(lái),我們聊聊!
1. 面試實(shí)錄:一個(gè)經(jīng)典的技術(shù)問(wèn)題
"請(qǐng)坐。"貝殼的面試官推了推眼鏡,翻看我的簡(jiǎn)歷。
"嗯,看你簡(jiǎn)歷寫(xiě)著負(fù)責(zé)過(guò)高并發(fā)系統(tǒng)優(yōu)化,用Redis做過(guò)緩存是吧?"
"是的。"
"那我們聊個(gè)基礎(chǔ)但很重要的問(wèn)題:Redis為什么這么快?"
...
它背后涉及三個(gè)核心問(wèn)題:
- 單線程如何支撐10萬(wàn)+ QPS?
- 數(shù)據(jù)結(jié)構(gòu)為何被稱為教科書(shū)級(jí)?
- 內(nèi)存管理如何做到極致優(yōu)化?
今天,我們一起走進(jìn)Redis的世界,看看它如何用極簡(jiǎn)的設(shè)計(jì)實(shí)現(xiàn)極致的性能。

2. 從架構(gòu)說(shuō)起
我:"關(guān)于Redis的高性能特性,我想先從整體架構(gòu)說(shuō)起":
Redis的速度快,主要得益于三個(gè)核心設(shè)計(jì):
(1) 純內(nèi)存操作(In-Memory Storage)

(2) 單線程模型(Single-Threaded)

(3) I/O多路復(fù)用(I/O Multiplexing)

面試官:"單線程模型很有意思,為什么單線程反而會(huì)更快?"
3. 為什么單線程反而會(huì)更快?
我:"Redis采用單線程模型有幾個(gè)重要優(yōu)勢(shì)":
(1) 避免線程切換開(kāi)銷
多線程系統(tǒng)的問(wèn)題:
線程1 執(zhí)行中 ──? 上下文切換 ──? 線程2 執(zhí)行中 ──? 上下文切換 ...
(耗時(shí)操作) (耗時(shí)操作)
Redis單線程模型:
命令1 ──? 命令2 ──? 命令3 (順序執(zhí)行,無(wú)切換開(kāi)銷)(2) 避免同步機(jī)制
- 不需要加鎖
- 不會(huì)出現(xiàn)死鎖
- 不需要考慮并發(fā)讀寫(xiě)
(3) 充分利用CPU
- 現(xiàn)代CPU的性能足夠強(qiáng)大
- 內(nèi)存操作的速度足夠快
- 單線程也能充分利用CPU性能
面試官:"那Redis是如何用單線程處理大量并發(fā)連接的呢?"
我:"這就要說(shuō)到Redis的I/O多路復(fù)用機(jī)制了。"
4. I/O多路復(fù)用機(jī)制
IO多路復(fù)用機(jī)制:
(1) 本質(zhì):一個(gè)線程處理多個(gè)IO流的機(jī)制
(2) 工作方式:
- 內(nèi)核負(fù)責(zé)監(jiān)聽(tīng)多個(gè)套接字
- Redis以單線程運(yùn)行
- 有請(qǐng)求時(shí)內(nèi)核通知Redis處理
(3) 效果:實(shí)現(xiàn)單線程高效處理多個(gè)并發(fā)連接
我們通過(guò)一個(gè)點(diǎn)餐的例子,來(lái)對(duì)比下。
傳統(tǒng)多線程模型(老式餐廳):
- 一桌一名服務(wù)員,資源占用大
- 服務(wù)員之間需要頻繁協(xié)調(diào)
- 擴(kuò)展成本高(100桌需要100名服務(wù)員)
- 人力資源利用率低
I/O多路復(fù)用(智能餐廳):
- 一名超級(jí)服務(wù)員 + 智能點(diǎn)餐系統(tǒng)
- 無(wú)需協(xié)調(diào),自動(dòng)任務(wù)分發(fā)
- 低成本高效能(1個(gè)服務(wù)員處理100+桌)
- 資源利用率最大化

IO多路復(fù)用工作原理:

面試官:"說(shuō)得不錯(cuò)。那數(shù)據(jù)結(jié)構(gòu)層面呢?"
5. 高效的數(shù)據(jù)結(jié)構(gòu)
我:"Redis在數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)上也做了大量?jī)?yōu)化":
(1) 字符串優(yōu)化 (SDS - Simple Dynamic String)

(2) Redis 漸進(jìn)式 Rehash

(3) 跳表(Sorted Set)優(yōu)化

6. Redis內(nèi)存管理三大法寶
面試官:"內(nèi)存管理方面有什么特別之處嗎?"
我:"Redis在內(nèi)存管理方面也做了很多工作":
- 精準(zhǔn)分配
- 巧用數(shù)據(jù)結(jié)構(gòu)
- 靈活管理策略

7. Redis性能優(yōu)化
面試官:"很好,最后一個(gè)問(wèn)題:如果讓你優(yōu)化Redis性能,你會(huì)從哪些方面入手?"
我:"我會(huì)從以下三個(gè)方面考慮":
- 合理使用數(shù)據(jù)結(jié)構(gòu)
- 避免性能陷阱
- 監(jiān)控和調(diào)優(yōu)

8. 總結(jié)
Redis的極致性能來(lái)自于三個(gè)關(guān)鍵點(diǎn):
- 極簡(jiǎn)設(shè)計(jì):?jiǎn)尉€程也能頂萬(wàn)線程
- 精妙結(jié)構(gòu):數(shù)據(jù)結(jié)構(gòu)就是生產(chǎn)力
- 智能管理:每一個(gè)字節(jié)都物盡其用
Redis不是因?yàn)閱尉€程才快,而是因?yàn)樗押?jiǎn)單的事情做到了極致。































