Redis的单线程和多线程
Redis的单线程和多线程
- Redis单线程的原因
- 避免锁竞争
- 内存操作速度极快
- 利用I/O多路复用提高并发
- 简化实现,提示稳定性
- Redis的多线程
- 为啥说Redis是单线程?
- Redis是纯单线程?
- 多线程I/O?
Redis单线程的原因
避免锁竞争
- 如果是多线程同时读取内存数据结构,就需要添加锁,会带来复杂的控制。
- 单线程串行执行命令,天然避免了数据竞争,保证了数据一致性和执行的可预测性
内存操作速度极快
- Redis 的数据都存储在内存中,内存的读写速度十分快,远远高于磁盘。
- 在这种场景下,CPU不是瓶颈,反而网络I/O才是主要开销,所以多线程意义不大。
利用I/O多路复用提高并发
- Redis使用epoll/kpueue这样的I/O多路复用机制,使得单线程也能同时管理成千上万的客户端连接。
简化实现,提示稳定性
- 单线程意味着代码逻辑简单,不需要复杂的并发,极大的提高了Redis的可靠性和维护性。
Redis的多线程
为啥说Redis是单线程?
- 核心网络I/O和执行命令是单线程的,即处理客户端请求,解析命令,读写数据是单线程。
- Redis依靠内存操作+高效的I/O多路复用,即使是单线程,也能支持高并发。
Redis是纯单线程?
不是的,Redis在后台会用多线程:
- 异步持久化:RDB快照、AOF重写会由子进程/线程完成。
- 集群数据同步(主从复制的网络传输)
- 异步删除大对象
多线程I/O?
Redis 6.0 的执行流程大致是:
- 多线程 负责接收客户端请求(read socket)、解析命令数据包;
- 单线程 负责执行命令(操作内存数据结构);
- 多线程 把执行结果写回给客户端(write socket)。
所以:
👉 命令执行仍然是单线程的,只是网络收发用多线程并行,提高吞吐。
Redis 6.0 是“单线程命令 + 多线程 I/O”,属于混合模式