redis单线程的多路复用接收网络io请求是单线程的,那么其内部处理逻辑也是单线程的?
网上找的资料都说是单线程的,但是看到有的说法说“站的角度不同,看待redis到底是单线程还是
多线程有所差别”,比较好奇,求解答,或者提供下资料地址,没有找到靠谱的说明,先行谢过
redis单线程的多路复用接收网络io请求是单线程的,那么其内部处理逻辑也是单线程的?
网上找的资料都说是单线程的,但是看到有的说法说“站的角度不同,看待redis到底是单线程还是
多线程有所差别”,比较好奇,求解答,或者提供下资料地址,没有找到靠谱的说明,先行谢过
在 redis 实战
里边是有谈到这个问题,但是其实问题的本质还是 UNIX IO
模型的运用,建议看一下UNIX 网络编程
第六章 IO复用
.说到具体的实现可以看一下 reactor 模式
.
Redis的网络模型是一个单线程epoll模型
,但是不见得处理过程始终单进程哦,有些处理可能会阻塞服务器,还是会开进程处理的:比如在保存RDB文件时候,https://github.com/antirez/redis/blob/unstable/src/rdb.c#L1059,还有sentinel,https://github.com/antirez/redis/blob/unstable/src/sentinel.c#L754
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
redis是多线程的,你会问如何确认,其实很简单,用gdb确认即可,我服务器上的刚好有部署redis,它的进程pid为26716。
正如上面一楼所说redis采用的是reactor的并发模型,也就是主线程使用io复用对多个客户端进行监听,有请求过来时,唤醒工作线程来做读io操作读取客户的请求数据,工作线程处理完请求向主线程注册写请求,客户端io可写时主线程唤醒工作线程,工作线程再进行写io操作把应答发送给客户端。主线程通过条件变量来唤醒工作线程,从上面gdb的输出可以看出工作线程都是调用pthread_cond_wait后被挂起,在等待主线程的唤醒,主线程则调用epoll_wait这个高效的io复用函数在等待客户端的请求。