【每日八股】复习 Redis Day4:线程模型
文章目录
- 复习 Redis Day4:线程模型
- 介绍一下 Redis 的线程模型
- 核心线程模型(Redis 6.0 之前)
- Redis 6.0+ 的多线程改进
- Redis 真的是单线程吗?
- Redis 的线程模型剖析
上一篇 Redis 的应用我今天才完成,因此明天一并复习 Redis 的应用和线程模型,今天我们直接学习 Redis 线程模型。
复习 Redis Day4:线程模型
介绍一下 Redis 的线程模型
Redis 的线程模式是其高性能的核心设计之一,其核心思想是「单线程处理命令 + 多线程辅助执行特定任务」。在 Redis 6.0 之前,单线程是 Redis 的核心线程模型,在 Redis 6.0 之后引入了多线程进行辅助。
核心线程模型(Redis 6.0 之前)
1. 单线程处理所有命令
主线程职责
- 接收客户端请求(网络 I/O);
- 解析命令、执行数据操作(如读写内存);
- 返回响应结果。
单线程优势
- 避免锁竞争:无需处理多线程并发问题;
- 顺序执行:所有命令顺序执行,天然避免竞态条件;
- 高效内存访问:单线程可充分利用 CPU 缓存局部性;
2. 多线程辅助任务
- 后台持久化:RDB 快照与 AOF 重写启用子进程来完成;
- 异步删除大 key:通过
UNLINK
命令(非阻塞删除)触发后台线程清理。
Redis 6.0+ 的多线程改进
Redis 6.0 引入了「多线程网络 I/O」,但命令执行仍然为单线程,其核心改进如下:
1. 多线程网络 I/O
- 主线程:负责监听和分发客户端连接请求;
- I/O 线程池:负责处理 socket 读写(解析请求和发送响应)。默认关闭,需要通过配置
io-threads N
启用。命令的执行仍然由主线程单线程处理,保证操作的原子性; - 性能提升:高并发场景下,网络 I/O 多线程可显著提升吞吐量。
2. 典型工作流
- 主线程接收新的连接请求,将连接的 Socket 分发给 I/O 线程;
- I/O 线程读取请求并解析命令,将命令放入队列;
- 主线程从队列拉取命令,单线程执行并生成响应;
- I/O 线程将响应写回客户端。
Redis 真的是单线程吗?
这个问题我把它当作一个「子问题」放在 Redis 线程模型简述之下。Redis 在执行命令时确实是单线程,在 Redis 6.0 之后引入的多线程也只是为了并发地处理多路网络 I/O 请求,在执行命令时仍然是单线程。
Redis 的线程模型剖析
Redis 内部使用一个「文件事件处理器(File Event Handler)」,它是单线程的,所以 Redis 才被称作单线程模型。文件事件处理器采用 IO 多路复用机制监听多个 socket,将产生事件的 socket 压入内存队列中,事件分派器根据 socket 上的事件来选的对应的事件处理器进行处理。
文件事件处理器的结构如下:
- 多个 socket;
- IO 多路复用;
- 文件事件分派器;
- 事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)。