前言
用過(guò)redis的人拓颓,或者去面試的人被問(wèn)redis的問(wèn)題讲坎,基本都會(huì)了解redis特別快。
redis高校的原因:
- 1.單線程政己,減少了線程切換的消耗酌壕。
- 2.基于內(nèi)存操作
- 3.IO多路復(fù)用
說(shuō)起IO多路復(fù)用,可以先從IO模型開(kāi)始了解歇由。
BIO
BIO是一種同步阻塞的IO模型卵牍,由用戶程序線程發(fā)起請(qǐng)求,完成數(shù)據(jù)的復(fù)制接收沦泌。
NIO
NIO是一種同步非阻塞的I/O模型糊昙,也是I/O多路復(fù)用的基礎(chǔ),成為解決高并發(fā)與大量連接谢谦、I/O處理問(wèn)題的有效方式释牺。
IO多路復(fù)用
IO多路復(fù)用模型,就是通過(guò)一種新的系統(tǒng)調(diào)用回挽,一個(gè)進(jìn)程可以監(jiān)視多個(gè)文件描述符没咙,一旦某個(gè)描述符就緒(一般是內(nèi)核緩沖區(qū)可讀/可寫(xiě)),內(nèi)核kernel能夠通知程序進(jìn)行相應(yīng)的IO系統(tǒng)調(diào)用千劈。
目前支持IO多路復(fù)用的系統(tǒng)調(diào)用祭刚,有 select,epoll等等墙牌。select系統(tǒng)調(diào)用袁梗,是目前幾乎在所有的操作系統(tǒng)上都有支持,具有良好跨平臺(tái)特性憔古。epoll是在linux 2.6內(nèi)核中提出的,是select系統(tǒng)調(diào)用的linux增強(qiáng)版本淋袖。
異步IO模型 AIO
在內(nèi)核kernel的等待數(shù)據(jù)和復(fù)制數(shù)據(jù)的兩個(gè)階段鸿市,用戶線程都不是block(阻塞)的。用戶線程需要接受kernel的IO操作完成的事件,或者說(shuō)注冊(cè)IO操作完成的回調(diào)函數(shù)焰情,到操作系統(tǒng)的內(nèi)核陌凳。所以說(shuō),異步IO有的時(shí)候内舟,也叫做信號(hào)驅(qū)動(dòng) IO 合敦。
多種IO模型區(qū)別
在以上多種IO模型中,各個(gè)模型有自己的特點(diǎn)验游,也有各自的優(yōu)缺點(diǎn)充岛。
BIO的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 1.BIO模型程序簡(jiǎn)單,用戶線程基本不會(huì)占用CPU資源耕蝉,無(wú)需線程切換崔梗。
- 2.在并發(fā)量小的情況下適用,不必用其他復(fù)雜的IO模型來(lái)解決問(wèn)題垒在。
缺點(diǎn):
- 1.每個(gè)連接配套一條獨(dú)立的線程蒜魄,在高并發(fā)的情況下,對(duì)內(nèi)存场躯、線程切換開(kāi)銷非常巨大谈为。
綜上,在簡(jiǎn)單的低并發(fā)的場(chǎng)景下踢关,為了降低程序的復(fù)雜度伞鲫,可以使用BIO,在高并發(fā)的場(chǎng)景下耘成,不建議使用榔昔。
NIO的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 線程非阻塞,實(shí)時(shí)性好瘪菌。
缺點(diǎn):
- 輪詢的行為撒会,毫無(wú)疑問(wèn)的講占用大量的CPU時(shí)間,系統(tǒng)資源利用率也會(huì)下降师妙。
綜上诵肛,可以看出,雖然具有非阻塞的特點(diǎn)默穴,但是在高并發(fā)的場(chǎng)景下怔檩,也存在著巨大的消耗問(wèn)題。單純的使用NIO蓄诽,并不建議使用薛训。
異步IO模型
優(yōu)點(diǎn):
- 線程非阻塞
缺點(diǎn):
- 需要用戶程序或者內(nèi)核空間做一系列事情來(lái)完成上述功能。
- 提出時(shí)間較短仑氛,并沒(méi)有非常完善的解決方案乙埃。
綜上闸英,雖然從模型上看,異步IO模型在各方面綜合比較來(lái)說(shuō)介袜,的確有非常大的優(yōu)勢(shì)甫何,但是還在完善階段,未來(lái)肯定會(huì)有更好的發(fā)揮作用遇伞,但是在現(xiàn)在的場(chǎng)景下辙喂,使用的還是相對(duì)較少。
IO多路復(fù)用
優(yōu)點(diǎn):
- 1.通過(guò)select/epoll優(yōu)勢(shì)鸠珠,一個(gè)線程可以處理更多的連接巍耗,提高了性能,提高了能力跳芳。
缺點(diǎn):
- select/epoll的系統(tǒng)調(diào)用芍锦,其實(shí)也是BIO,也是阻塞的飞盆,而且也是通過(guò)輪詢的方式娄琉。
綜上所述,IO多路復(fù)用其實(shí)也是有阻塞的吓歇,只不過(guò)相對(duì)于一個(gè)線程維護(hù)一個(gè)連接孽水,大大提高了性能,減少了系統(tǒng)的開(kāi)銷城看。
IO多路復(fù)用也是大多數(shù)框架使用的IO模型女气。
redis中IO多路復(fù)用
redis服務(wù)器中有兩類事件:
- 文件事件:redis主進(jìn)程中進(jìn)行處理,主要處理客戶端的連接請(qǐng)求和響應(yīng)
- 時(shí)間事件:fork出的子進(jìn)程中進(jìn)行處理测柠,服務(wù)器定期或者周期性執(zhí)行的事件炼鞠,例如,rdb轰胁、aof等
文件事件是對(duì)套接字操作的抽象谒主,每當(dāng)一個(gè)套接字準(zhǔn)備好執(zhí)行連接應(yīng)答、寫(xiě)入赃阀、讀取费尽、關(guān)閉等操作時(shí)鸣个,就會(huì)產(chǎn)生一個(gè)文件事件酌予。
包括可讀事件永票、可寫(xiě)事件。
針對(duì)套接字驮俗、文件事件懂缕、文件描述符等概念后續(xù)計(jì)劃出一篇文章進(jìn)行講解。