redis单线程

虎胖胖 11月15日提问
0

redis单线程的多路复用接收网络io请求是单线程的,那么其内部处理逻辑也是单线程的?
网上找的资料都说是单线程的,但是看到有的说法说“站的角度不同,看待redis到底是单线程还是
多线程有所差别”,比较好奇,求解答,或者提供下资料地址,没有找到靠谱的说明,先行谢过

查看全部 3 个回答

1

redis 实战 里边是有谈到这个问题,但是其实问题的本质还是 UNIX IO 模型的运用,建议看一下UNIX 网络编程 第六章 IO复用.说到具体的实现可以看一下 reactor 模式 .

推荐答案

1

已采纳

redis是多线程的,你会问如何确认,其实很简单,用gdb确认即可,我服务器上的刚好有部署redis,它的进程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) 

正如上面一楼所说redis采用的是reactor的并发模型,也就是主线程使用io复用对多个客户端进行监听,有请求过来时,唤醒工作线程来做读io操作读取客户的请求数据,工作线程处理完请求向主线程注册写请求,客户端io可写时主线程唤醒工作线程,工作线程再进行写io操作把应答发送给客户端。主线程通过条件变量来唤醒工作线程,从上面gdb的输出可以看出工作线程都是调用pthread_cond_wait后被挂起,在等待主线程的唤醒,主线程则调用epoll_wait这个高效的io复用函数在等待客户端的请求。