前言
在面試的時(shí)候遇到Redis肯定會(huì)問(wèn),Redis單線程為什么那么快呀?你可以說(shuō)下你對(duì)IO多路復(fù)用的機(jī)制嘛。但是仔細(xì)一想Redis真的是單線程在運(yùn)行處理嘛,其實(shí)這個(gè)單線程主要指的Redis的網(wǎng)絡(luò)IO和鍵值對(duì)讀寫是由一個(gè)線程來(lái)完成的,Redis在處理客戶端的請(qǐng)求,包括socket讀取、解析、執(zhí)行、寫入socket都由一個(gè)順序串行的主線程處理。但是其他的流程比如說(shuō)持久化AOF、RDB、集群數(shù)據(jù)同步等都有別的線程完成。
Redis命令工作線程是單線程的,但是,整個(gè)Redis來(lái)說(shuō),是多線程的;
Redis為什么用單線程
多線程的開銷
程序設(shè)計(jì)中,一般為了充分利用操作系統(tǒng)底層資源,都需要進(jìn)行設(shè)計(jì)多線程編程,但是無(wú)腦的使用多線程編程,并不會(huì)得到一直較高的系統(tǒng)吞吐率。因?yàn)槎嗑€程之間存在系統(tǒng)資源的競(jìng)爭(zhēng),如果不能合理的設(shè)計(jì)對(duì)共享資源的訪問(wèn),那么就可能出現(xiàn)串行執(zhí)行的結(jié)果。
在并發(fā)編程領(lǐng)域來(lái)說(shuō),共享資源競(jìng)爭(zhēng)問(wèn)題是必須面對(duì)的問(wèn)題,否則處理不好,可能會(huì)導(dǎo)致數(shù)據(jù)出現(xiàn)紊亂。比如同時(shí)操作key1,A線程修改為1,B線程修改為2。如何保證同一時(shí)間只有一個(gè)線程在處理。并且我們需要維護(hù)對(duì)共享資源的互斥關(guān)系,在程序設(shè)計(jì)需要去考慮這些問(wèn)題,因此Redis采用單線程。
單線程為什么快?
一是由于本身在內(nèi)存中操作,并且利用高效的數(shù)據(jù)結(jié)構(gòu)哈希表,跳表等。二是由于利用了IO多路服用機(jī)制來(lái)實(shí)現(xiàn)在網(wǎng)絡(luò)IO中可以并發(fā)處理大量的客戶端請(qǐng)求。
基本IO模型與阻塞點(diǎn)
如果我們操作的是簡(jiǎn)單的get key1操作,全流程就是首先監(jiān)聽(tīng)客戶端的請(qǐng)求(bind/listen)、Accept(建立連接)、recv(從socket獲取數(shù)據(jù))、parse(解析數(shù)據(jù))、獲取數(shù)據(jù)之后get,最后發(fā)送數(shù)據(jù)寫入socket中。
但是圖中,在accept建立連接和recv\send過(guò)程可能出現(xiàn)連接建立被阻塞,或者從socket中獲取不到數(shù)據(jù)。
非阻塞模式
在Socket模型中,不同的操作會(huì)返回不同的套接字類型,socket()會(huì)返回套接字,接著調(diào)用listen()返回監(jiān)聽(tīng)套接字,然后調(diào)用accept()返回已連接套接字。
當(dāng)我們調(diào)用accept()套接字,如果一直沒(méi)有請(qǐng)求建立連接,那么不會(huì)一直等待,而是返回去操作其他請(qǐng)求。
IO多路復(fù)用模型
IO多路復(fù)用是指一個(gè)線程可以處理多個(gè)IO流,Redis在單線程運(yùn)行的情況下,可以同時(shí)監(jiān)聽(tīng)多個(gè)套接字和已連接套接字,一旦有請(qǐng)求到達(dá),Redis線程就可以處理。
FD就是多個(gè)套接字,
上述流程一個(gè)線程進(jìn)行監(jiān)聽(tīng)套接字,當(dāng)有對(duì)應(yīng)的套接字發(fā)生時(shí),出發(fā)對(duì)應(yīng)的事件寫入到對(duì)應(yīng)的事件隊(duì)列中,然后通過(guò)對(duì)應(yīng)的事件回調(diào)函數(shù)進(jìn)行處理。
但是這里其實(shí)也設(shè)計(jì)到了網(wǎng)絡(luò)編程中的模型,以及對(duì)應(yīng)的同步、異步、阻塞、非阻塞
BIO、NIO、IO多路復(fù)用,對(duì)應(yīng)的select、poll、epoll等由于涉及的東西比較多,這個(gè)我在下一篇文章中具體解釋下。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-443791.html
小結(jié)
本篇主要介紹了Redis為什么執(zhí)行快,已經(jīng)引入多線程的存在的問(wèn)題。最后引入IO多路復(fù)用機(jī)制。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-443791.html
到了這里,關(guān)于【Redis】Redis 高性能IO模型原理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!