1. Redis 为什么选择单线程模型处理命令?单线程为何仍能达到十万级 QPS(纯内存操作、IO 多路复用、避免锁竞争与上下文切换)?
请说明 Redis 为什么选择单线程模型处理命令,以及单线程为何仍能达到十万级 QPS?
- 单线程模型的由来(瓶颈在 IO 而非 CPU)
- 纯内存操作 + IO 多路复用
- 避免锁竞争与上下文切换
Redis 早期选择单线程模型的原因:命令处理是纯内存操作,CPU 不是瓶颈,瓶颈在网络 IO;单线程避免了多线程的锁竞争、上下文切换与数据同步开销,同时使命令天然原子、实现简单。配合 IO 多路复用(epoll),单线程能同时处理大量连接,在网络与内存足够快时达到十万级 QPS。单线程也能保证操作的原子性(无需加锁)。当网络 IO 成为新瓶颈时,Redis 6.0 引入多线程 IO 解决读写瓶颈,但命令执行仍单线程。
单线程并非性能差,而是"瓶颈不对称"下的正确选择:内存快、CPU 富余、网络与锁是主坑。多线程会引入锁竞争与一致性问题,反而抵消收益。