在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/人工智能  Java/ redis單線(xiàn)程

redis單線(xiàn)程

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)求。

2017年4月21日 01:32
編輯回答
離夢(mè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

2017年11月24日 05:04
編輯回答
只愛(ài)你

redis 實(shí)戰(zhàn) 里邊是有談到這個(gè)問(wèn)題,但是其實(shí)問(wèn)題的本質(zhì)還是 UNIX IO 模型的運(yùn)用,建議看一下UNIX 網(wǎng)絡(luò)編程 第六章 IO復(fù)用.說(shuō)到具體的實(shí)現(xiàn)可以看一下 reactor 模式 .

2018年1月28日 06:13