007.Redis單線程模型介紹

1. 理解單線程模型

  1. redis 會(huì)將每個(gè)客戶端都關(guān)聯(lián)一個(gè)指令隊(duì)列兑巾∧锼客戶端的指令通過隊(duì)列來按順序處理,先到先服務(wù)赘那。
  2. 在一個(gè)客戶端的指令隊(duì)列中的指令是順序執(zhí)行的泪喊,但是多個(gè)指令隊(duì)列中的指令是無法保證順序的棚愤,例如執(zhí)行完 client-0 的隊(duì)列中的 command-0 后伪很,接下去是執(zhí)行哪個(gè)隊(duì)列中的第一個(gè)指令是無法確定的戚啥,但是肯定不會(huì)同時(shí)執(zhí)行兩個(gè)指令。
  3. redis 同樣也會(huì)為每個(gè)客戶端關(guān)聯(lián)一個(gè)響應(yīng)隊(duì)列锉试,通過響應(yīng)隊(duì)列來順序地將指令的返回結(jié)果回復(fù)給客戶端猫十。
  4. 同樣,一個(gè)響應(yīng)隊(duì)列中的消息可以順序的回復(fù)給客戶端,多個(gè)響應(yīng)隊(duì)列之間是無法保證順序的炫彩。
  5. 所有的客戶端的隊(duì)列中的指令或者響應(yīng),redis 每次都只能處理一個(gè)絮短,同一時(shí)間絕對(duì)不會(huì)處理超過一個(gè)指令或者響應(yīng)江兢。

2. 為什么redis使用單線程模型還能保證高性能?

(1) 純內(nèi)存訪問

redis 將所有數(shù)據(jù)放在內(nèi)存中丁频,內(nèi)存的響應(yīng)時(shí)長(zhǎng)大約為 100 納秒杉允,這是 redis 的 QPS 過萬的重要基礎(chǔ)。

(2) 非阻塞式IO

  • 什么是阻塞式 IO

當(dāng)我們調(diào)用 Scoket 的讀寫方法席里,默認(rèn)它們是阻塞的叔磷。

read() 方法要傳遞進(jìn)去一個(gè)參數(shù) n,表示讀取這么多字節(jié)后再返回奖磁,如果沒有讀夠 n 字節(jié)線程就會(huì)阻塞改基,直到新的數(shù)據(jù)到來或者連接關(guān)閉了, read 方法才可以返回咖为,線程才能繼續(xù)處理秕狰。

write() 方法會(huì)首先把數(shù)據(jù)寫到系統(tǒng)內(nèi)核為 Scoket 分配的寫緩沖區(qū)中,當(dāng)寫緩存區(qū)滿溢躁染,即寫緩存區(qū)中的數(shù)據(jù)還沒有寫入到磁盤鸣哀,就有新的數(shù)據(jù)要寫道寫緩存區(qū)時(shí),write() 方法就會(huì)阻塞吞彤,直到寫緩存區(qū)中有空閑空間我衬。

  • 什么是非阻塞式 IO

非阻塞 IO 在 Scoket 對(duì)象上提供了一個(gè)選項(xiàng)Non_Blocking ,當(dāng)這個(gè)選項(xiàng)打開時(shí)饰恕,讀寫方法不會(huì)阻塞挠羔,而是能讀多少讀多少,能寫多少寫多少埋嵌。

能讀多少取決于內(nèi)核為 Scoket 分配的讀緩沖區(qū)的大小褥赊,能寫多少取決于內(nèi)核為 Scoket 分配的寫緩沖區(qū)的剩余空間大小。讀方法和寫方法都會(huì)通過返回值來告知程序?qū)嶋H讀寫了多少字節(jié)數(shù)據(jù)莉恼。

有了非阻塞 IO 意味著線程在讀寫 IO 時(shí)可以不必再阻塞了拌喉,讀寫可以瞬間完成然后線程可以繼續(xù)干別的事了。

(3) IO多路復(fù)用

非阻塞 IO 有個(gè)問題俐银,那就是單個(gè)線程要處理多個(gè)讀寫請(qǐng)求尿背,處理某個(gè)客戶端的的讀數(shù)據(jù)的請(qǐng)求,結(jié)果讀了一部分就返回了捶惜,線程如何知道什么時(shí)候才應(yīng)該繼續(xù)讀數(shù)據(jù)田藐。處理寫請(qǐng)求的時(shí)候,如果緩沖區(qū)滿了,寫不完汽久,剩下的數(shù)據(jù)何時(shí)才應(yīng)該繼續(xù)寫鹤竭?在什么時(shí)候處理什么請(qǐng)求?redis 單線程處理多個(gè)IO請(qǐng)求時(shí)就用到了IO多路復(fù)用技術(shù)景醇。

簡(jiǎn)單的理解下 IO 多路復(fù)用技術(shù)臀稚,假設(shè)每個(gè)客戶端的 IO 請(qǐng)求是一條電路,redis 是一個(gè)開關(guān)三痰,如下圖所示:

在上圖中吧寺,redis 需要處理 3 個(gè) IO 請(qǐng)求,同時(shí)把 3 個(gè)請(qǐng)求的結(jié)果返回給客戶端散劫,所以總共需要處理 6 個(gè) IO 事件稚机,由于 redis 是單線程模型,同一時(shí)間只能處理一個(gè) IO 事件获搏,于是 redis 需要在合適的時(shí)間暫停對(duì)某個(gè) IO 事件的處理赖条,轉(zhuǎn)而去處理另一個(gè) IO 事件,這樣 redis 就好比一個(gè)開關(guān)常熙,當(dāng)開關(guān)撥到哪個(gè) IO 事件這個(gè)電路上谋币,就處理哪個(gè) IO 事件,其他 IO 事件就暫停處理了症概。這就是IO多路復(fù)用技術(shù)蕾额。

以上是大致的理解下 IO 多路復(fù)用技術(shù),在系統(tǒng)底層彼城,IO 多路復(fù)用有 3 種實(shí)現(xiàn)機(jī)制:

  • select
  • poll
  • epoll

這些實(shí)現(xiàn)機(jī)制的底層我不清楚诅蝶,看過一些博客(細(xì)節(jié)也沒看懂),總結(jié)一下就是:

epoll 是目前最新的也是最先進(jìn)的 IO 多路復(fù)用的實(shí)現(xiàn)解決了select 和 poll 的很多問題募壕。而 redis 就是使用的基于 epoll 的 IO 多路復(fù)用技術(shù)调炬。

對(duì)這 3 種實(shí)現(xiàn)機(jī)制感興趣的話,可以去看看大神的博客舱馅,本人在這里就不再胡說了缰泡。

(4) 單線程避免了線程切換和競(jìng)態(tài)產(chǎn)生的消耗。

單線程能帶來幾個(gè)好處:

  • 第一代嗤,單線程可以簡(jiǎn)化數(shù)據(jù)結(jié)構(gòu)和算法的實(shí)現(xiàn)棘钞。并發(fā)數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)不但困難而且開發(fā)測(cè)試比較麻

  • 第二,單線程避免了線程切換和競(jìng)態(tài)產(chǎn)生的消耗干毅,對(duì)于服務(wù)端開發(fā)來說宜猜,鎖和線程切換通常是性能殺手。

  • 單線程的問題:對(duì)于每個(gè)命令的執(zhí)行時(shí)間是有要求的硝逢。如果
    某個(gè)命令執(zhí)行過長(zhǎng)姨拥,會(huì)造成其他命令的阻塞绅喉,所以 redis 適用于那些需要快速執(zhí)行的場(chǎng)景。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末叫乌,一起剝皮案震驚了整個(gè)濱河市柴罐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌憨奸,老刑警劉巖革屠,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異膀藐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)红省,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門额各,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吧恃,你說我怎么就攤上這事虾啦。” “怎么了痕寓?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵傲醉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我呻率,道長(zhǎng)硬毕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任礼仗,我火速辦了婚禮吐咳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘元践。我一直安慰自己韭脊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布单旁。 她就那樣靜靜地躺著沪羔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪象浑。 梳的紋絲不亂的頭發(fā)上蔫饰,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音愉豺,去河邊找鬼死嗦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛粒氧,可吹牛的內(nèi)容都是我干的越除。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼摘盆!你這毒婦竟也來了翼雀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤孩擂,失蹤者是張志新(化名)和其女友劉穎狼渊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體类垦,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狈邑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蚤认。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片米苹。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖砰琢,靈堂內(nèi)的尸體忽然破棺而出蘸嘶,到底是詐尸還是另有隱情,我是刑警寧澤陪汽,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布训唱,位于F島的核電站,受9級(jí)特大地震影響挚冤,放射性物質(zhì)發(fā)生泄漏况增。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一训挡、第九天 我趴在偏房一處隱蔽的房頂上張望巡通。 院中可真熱鬧,春花似錦舍哄、人聲如沸宴凉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弥锄。三九已至,卻和暖如春蟆沫,著一層夾襖步出監(jiān)牢的瞬間籽暇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工饭庞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留戒悠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓舟山,卻偏偏與公主長(zhǎng)得像绸狐,于是被迫代替她去往敵國(guó)和親卤恳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 一. 操作系統(tǒng)概念 操作系統(tǒng)位于底層硬件與應(yīng)用軟件之間的一層.工作方式: 向下管理硬件,向上提供接口.操作系統(tǒng)進(jìn)行...
    月亮是我踢彎得閱讀 5,959評(píng)論 3 28
  • 必備的理論基礎(chǔ) 1.操作系統(tǒng)作用: 隱藏丑陋復(fù)雜的硬件接口寒矿,提供良好的抽象接口突琳。 管理調(diào)度進(jìn)程,并將多個(gè)進(jìn)程對(duì)硬件...
    drfung閱讀 3,528評(píng)論 0 5
  • 1.項(xiàng)目中緩存是如何使用的符相?為什么要用緩存拆融?緩存使用不當(dāng)會(huì)造成什么后果? 面試題剖析 為什么要用緩存啊终? 用緩存镜豹,主...
    jsbintask閱讀 9,159評(píng)論 0 217
  • 糾結(jié)的就是模考題蓝牲,同學(xué)說我現(xiàn)在應(yīng)該過分填志愿趟脂,但是覺得自己還有很大的傷神空間,所以就這樣一直拖了一下搞旭。 Anw...
    忽爾今至閱讀 113評(píng)論 0 0
  • 文/源琪琪 圖/源琪琪 最近心里莫名地?zé)┰晟⒉溃谑桥R摹了偶像的《冰塊與水杯》菇绵,臨摹的不太好肄渗,要繼續(xù)努力嘍。 【第一步...
    源源de源琪琪閱讀 292評(píng)論 0 3