- Redis 5.x及以前都是单线程,6.0及以后才是多线程
- 不管是单线程还是多线程都是单work线程,多线程指的是IO子线程
- 单线程模型为单work线程,执行步骤如下
3.1. work线程读取客户端指令
3.2. work线程执行指令
3.3. work线程响应客户端 - 多线程模型也为单work线程,但是又多个IO线程,其执行步骤如下
4.1. work线程负责接收客户端连接,接收连接后把连接放入等待列表中。
4.2. work线程接收到连接后把socket分配给IO线程组,IO线程组读取指令,IO线程组读取指令过程中work线程堵塞
4.3. work线程执行这些指令(执行过程中依然是单线程)
4.4. IO线程组响应执行结果,响应过程中work线程堵塞
4.5. 多线程模型其执行步骤图如下
总结:可以看出来Redis多线程只是读取和响应的客户端请求的时候是多线程,实际执行过程还是单线程。之所以这么设计的原因是Redis的瓶颈往往是在网络IO和内存,而内存通过加硬件可以解决,Redis多线程模型主要解决的是网络IO瓶颈,通过多个线程来读取请求,单个线程来执行请求,即可以保证读取与响应的高性能,又可以保证执行过程中是串行化,不需要考虑锁,线程切换等复杂的逻辑,也不会由于多线程的死锁问题带来性能的降低。