redis單線(xiàn)程的多路復(fù)用接收網(wǎng)絡(luò)io請(qǐng)求是單線(xiàn)程的,那么其內(nèi)部處理邏輯也是單線(xiàn)程的?
網(wǎng)上找的資料都說(shuō)是單線(xiàn)程的,但是看到有的說(shuō)法說(shuō)“站的角度不同,看待redis到底是單線(xiàn)程還是
多線(xiàn)程有所差別”,比較好奇,求解答,或者提供下資料地址,沒(méi)有找到靠譜的說(shuō)明,先行謝過(guò)
redis是多線(xiàn)程的,你會(huì)問(wèn)如何確認(rèn),其實(shí)很簡(jiǎn)單,用gdb確認(rèn)即可,我服務(wù)器上的剛好有部署redis,它的進(jìn)程pid為26716。
[root@rookie_centos myXxl]# gdb -p 26716
[Thread debugging using libthread_db enabled]
Loaded symbols for /lib64/libpthread.so.0
Reading symbols from /lib64/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib64/libc.so.6
Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
0x00007f6e8faa81c3 in epoll_wait () from /lib64/libc.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.209.el6_9.2.x86_64
(gdb) bt
#0 0x00007f6e8faa81c3 in epoll_wait () from /lib64/libc.so.6
#1 0x000000000042491e in aeApiPoll (eventLoop=0x7f6e894340a0, flags=11) at ae_epoll.c:112
#2 aeProcessEvents (eventLoop=0x7f6e894340a0, flags=11) at ae.c:404
#3 0x0000000000424d3b in aeMain (eventLoop=0x7f6e894340a0) at ae.c:464
#4 0x000000000042d902 in main (argc=<value optimized out>, argv=0x7ffe660d3dd8) at server.c:3865
(gdb) info threads
4 Thread 0x7f6e893ff700 (LWP 26718) 0x00007f6e8fd5e68c in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
3 Thread 0x7f6e889fe700 (LWP 26719) 0x00007f6e8fd5e68c in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
2 Thread 0x7f6e87ffd700 (LWP 26720) 0x00007f6e8fd5e68c in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
* 1 Thread 0x7f6e9060c740 (LWP 26716) 0x00007f6e8faa81c3 in epoll_wait () from /lib64/libc.so.6
(gdb)
正如上面一樓所說(shuō)redis采用的是reactor的并發(fā)模型,也就是主線(xiàn)程使用io復(fù)用對(duì)多個(gè)客戶(hù)端進(jìn)行監(jiān)聽(tīng),有請(qǐng)求過(guò)來(lái)時(shí),喚醒工作線(xiàn)程來(lái)做讀io操作讀取客戶(hù)的請(qǐng)求數(shù)據(jù),工作線(xiàn)程處理完請(qǐng)求向主線(xiàn)程注冊(cè)寫(xiě)請(qǐng)求,客戶(hù)端io可寫(xiě)時(shí)主線(xiàn)程喚醒工作線(xiàn)程,工作線(xiàn)程再進(jìn)行寫(xiě)io操作把應(yīng)答發(fā)送給客戶(hù)端。主線(xiàn)程通過(guò)條件變量來(lái)喚醒工作線(xiàn)程,從上面gdb的輸出可以看出工作線(xiàn)程都是調(diào)用pthread_cond_wait后被掛起,在等待主線(xiàn)程的喚醒,主線(xiàn)程則調(diào)用epoll_wait這個(gè)高效的io復(fù)用函數(shù)在等待客戶(hù)端的請(qǐng)求。
Redis的網(wǎng)絡(luò)模型是一個(gè)單線(xiàn)程epoll模型,但是不見(jiàn)得處理過(guò)程始終單進(jìn)程哦,有些處理可能會(huì)阻塞服務(wù)器,還是會(huì)開(kāi)進(jìn)程處理的:比如在保存RDB文件時(shí)候,https://github.com/antirez/redis/blob/unstable/src/rdb.c#L1059,還有sentinel,https://github.com/antirez/redis/blob/unstable/src/sentinel.c#L754
北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專(zhuān)業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。