Redis 6.0 引入了多线程,我现在看了一些文章明白了大概的流程如下:
- 主线程 epoll_wait 一段时间,收集 N 个读事件后交给 I/O 线程池去处理读 socket 和解析请求
- 主线程阻塞等待 I/O 线程池完成 N 个读事件
- 主线程把解析出来的命令进行统一的处理
- 主线程把处理的结果放入缓冲区,又交给 I/O 线程池处理写 socket
- 主线程阻塞等待 I/O 线程池完成
步骤 3 命令的处理需要放在主线程统一完成我能理解,是避免多线程的竞争开销。我疑惑的是为什么步骤 2 和步骤 5 要阻塞等待,能不能改成这样:
- 主线程 epoll_wait 一段时间,收集 N 个读事件后交给 I/O 线程池去处理读 socket 和解析请求
- 主线程把解析出来的命令进行统一处理(步骤 1 的 I/O 线程池完成几个算几个),再把处理的结果放入缓冲区,交给 I/O 线程池处理写 socket
步骤 1 和步骤 2 是异步的,这样是不是效率更高?不知道我这个想法有什么问题
