Redis 线程模型
面试官问:"Redis 是单线程还是多线程的?"
小陈说:"单线程的。"
面试官追问:"为什么单线程的 Redis 这么快?"
小陈说:"因为在内存里操作。"
面试官继续追问:"那 I/O 多路复用是什么?Redis 是怎么处理多个客户端连接的?"
小陈开始支支吾吾。
Redis 的单线程 + I/O 多路复用是 Redis 高性能的核心原因之一。这道题能说清楚"单线程处理什么"和"多路复用如何工作"的候选人,对 Redis 的架构设计有较深的理解。
一、Redis 的线程模型 🔴
1.1 常见误解
1.2 Redis 6.0 前的线程模型
核心组件:
- I/O 多路复用:监听多个 socket 的可读/可写事件
- 文件事件分派器:将就绪的 socket 分派给对应处理器
- 命令请求处理器:读取 socket 数据,解析命令,执行命令
- 命令回复处理器:将执行结果写回 socket
1.3 ❌ 错误示范
候选人原话:"Redis 单线程,所以只能用 1 个 CPU 核心。"
问题诊断:部分正确。Redis 主线程确实只能用 1 个核心,但 Redis 的后台进程(BIO)会用其他核心,且现代 Redis 支持多线程 IO。
候选人原话 2:"Redis 快是因为用了 epoll。"
问题诊断:不精确。epoll 是 Linux 的 I/O 多路复用机制,Redis 用它来监听多个客户端连接,但 Redis 快的主要原因是在内存中操作数据(O(1) 或 O(log n)),而不是 epoll。
【面试官心理】 这道题我会从 I/O 多路复用的原理切入。如果候选人能说出"一个线程监听多个 socket,哪个 socket 就绪就读哪个",说明他理解了这套机制的核心思想。
二、I/O 多路复用原理 🔴
2.1 三种 I/O 模型对比
2.2 epoll 的工作原理
2.3 Redis 的事件循环
三、命令执行流程 🔴
3.1 完整的请求处理流程
3.2 为什么单线程快?
四、Redis 6.0 多线程 IO 🟡
4.1 多线程 IO 的引入
4.2 配置方式
4.3 性能提升
【面试官心理】 Redis 6.0 的多线程 IO 是 Redis 演进中的重要特性。能说清楚"多线程 IO 只是读取/写回多线程,执行还是单线程"的候选人,说明他对 Redis 的架构演进有持续关注。