11_redis_線程 IO 模型

redis是單線程弄兜。
單線程還快的原因是:所有的數(shù)據(jù)都是在內(nèi)存中棋蚌,運(yùn)算都是內(nèi)存級(jí)別的。對(duì)于o(n)的指令要慎用挨队,不然會(huì)造成卡頓
單線程處理并發(fā):多路復(fù)用,非阻塞IO

非阻塞IO

當(dāng)使用套接字讀取的時(shí)候蒿往,默認(rèn)是阻塞的盛垦,read方法需要傳一個(gè)參數(shù)n,表示讀取這么多的字節(jié)后返回瓤漏,如果沒(méi)有讀取到這么多字節(jié)線程就會(huì)卡在那里腾夯,等新的數(shù)據(jù)過(guò)來(lái)颊埃,或者連接關(guān)閉,才會(huì)將數(shù)據(jù)返回蝶俱。write方法一般是不會(huì)阻塞的班利,除非內(nèi)核中為套接字分配的緩沖區(qū)已經(jīng)滿了,write方法就會(huì)阻塞榨呆,直到到緩沖區(qū)重新分配新的空間后罗标。
非阻塞IO,是在套接字對(duì)象加入一個(gè)Non_Blocking积蜻。當(dāng)這個(gè)選項(xiàng)打開的時(shí)候闯割,讀寫方法不會(huì)阻塞,而是能讀多少讀多少竿拆,能寫多少寫多少宙拉。讀寫多少取決于為內(nèi)核為套接字分配的讀寫緩沖區(qū)內(nèi)部的字節(jié)數(shù)。讀寫方法返回值會(huì)告知讀寫了多少字節(jié)丙笋。

事件輪詢(多路復(fù)用)

飛阻塞IO有一個(gè)問(wèn)題谢澈,就是結(jié)果讀寫到一半的時(shí)候就返回了,線程如何知道什么時(shí)候需要繼續(xù)讀咧御板?就是當(dāng)數(shù)據(jù)來(lái)的時(shí)候锥忿,線程是如何知道呢?寫的時(shí)候稳吮,怎么知道緩沖區(qū)滿了缎谷,寫不完了,剩下的數(shù)據(jù)該什么時(shí)候才能寫呢灶似?

事件輪詢API就是解決這個(gè)問(wèn)題的列林。
最簡(jiǎn)單的事件輪詢API就是select函數(shù),是操作系統(tǒng)提供的酪惭。輸入是讀寫描述符列表read_fds&write_fds希痴。輸出就是對(duì)應(yīng)的可讀可寫的事件,同時(shí)提供了timeout參數(shù)春感,當(dāng) 沒(méi)有任何事件到來(lái)砌创,會(huì)等timeout時(shí)間,線程處于阻塞狀態(tài)鲫懒。一旦期間有任何事件過(guò)來(lái)嫩实,就會(huì)立即返回。拿到事件后窥岩,線程順序處理相應(yīng)的事件甲献,處理完后過(guò)來(lái)輪詢,于是線程進(jìn)入了一個(gè)死循環(huán)颂翼,稱之為事件循環(huán)晃洒,一個(gè)循環(huán)一個(gè)周期

因?yàn)橥ㄟ^(guò)select函數(shù)調(diào)用處理多個(gè)管道描述符 的讀寫事件慨灭,所以稱之為多路復(fù)用API。現(xiàn)在操作系統(tǒng)多路復(fù)用已經(jīng)不用select函數(shù)了球及,而是使用epoll (linux) 氧骤,kqueue(freebsd & macosx),因?yàn)閟elect描述符多的時(shí)候性能變差吃引。他們的本質(zhì)都是差不多的筹陵。
事件輪詢API就是java中的NIO技術(shù)。

指令隊(duì)列

redis為每個(gè)客戶端套接字都關(guān)聯(lián)了一個(gè)指令隊(duì)列际歼,客戶端的指令通過(guò)隊(duì)列進(jìn)行順序處理惶翻,先到先處理。

響應(yīng)隊(duì)列

redis為每個(gè)客戶端套接字也提供了一個(gè)響應(yīng)隊(duì)列鹅心,服務(wù)器通過(guò)響應(yīng)隊(duì)列將響應(yīng)的結(jié)果返回給客戶端吕粗。如果隊(duì)列為空,意味著現(xiàn)在連接處于空閑狀態(tài)旭愧,不需要獲取事件颅筋,就是將客戶端描述符從write_fds中移除。當(dāng)隊(duì)列有數(shù)據(jù)的時(shí)候输枯,再將描述符添加到write_fds中议泵。應(yīng)避免selelct系統(tǒng)調(diào)用立即返回寫事件,這樣會(huì)使cpu瞬間升高桃熄。

定時(shí)任務(wù)

服務(wù)器在處理IO的時(shí)候還要處理其他的事情先口,如果線程阻塞在select上面,還是需要處理別的事情瞳收。
redis的處理方式是:
將定時(shí)任務(wù)記錄到稱之為最小堆的數(shù)據(jù)結(jié)構(gòu)中碉京,這個(gè)堆中,最快處理的任務(wù)排在堆的最上方螟深, 每個(gè)循環(huán)周期會(huì)處理排在最上面的任務(wù)谐宙,處理完之后, 將下一個(gè)最快執(zhí)行的任務(wù)還需要的時(shí)間記錄下來(lái)界弧,這個(gè)時(shí)間就是selelct系統(tǒng)調(diào)用的timeout的時(shí)間凡蜻,因?yàn)橹涝趖imeout時(shí)間內(nèi)沒(méi)有需要處理的任務(wù),所以可以安心的睡眠垢箕。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末划栓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子条获,更是在濱河造成了極大的恐慌忠荞,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異钻洒,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)锄开,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門素标,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人萍悴,你說(shuō)我怎么就攤上這事头遭。” “怎么了癣诱?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵计维,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我撕予,道長(zhǎng)鲫惶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任实抡,我火速辦了婚禮欠母,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吆寨。我一直安慰自己赏淌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布啄清。 她就那樣靜靜地躺著六水,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辣卒。 梳的紋絲不亂的頭發(fā)上掷贾,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音添寺,去河邊找鬼胯盯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛计露,可吹牛的內(nèi)容都是我干的博脑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼票罐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼叉趣!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起该押,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤疗杉,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烟具,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡梢什,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了朝聋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗡午。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖冀痕,靈堂內(nèi)的尸體忽然破棺而出荔睹,到底是詐尸還是另有隱情,我是刑警寧澤言蛇,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布僻他,位于F島的核電站,受9級(jí)特大地震影響腊尚,放射性物質(zhì)發(fā)生泄漏吨拗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一跟伏、第九天 我趴在偏房一處隱蔽的房頂上張望丢胚。 院中可真熱鬧,春花似錦受扳、人聲如沸携龟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)峡蟋。三九已至,卻和暖如春华望,著一層夾襖步出監(jiān)牢的瞬間蕊蝗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工赖舟, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蓬戚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓宾抓,卻偏偏與公主長(zhǎng)得像子漩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子石洗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354