Redis 单线程模型

张开发
2026/4/16 11:15:13 15 分钟阅读

分享文章

Redis 单线程模型
深入解析 Redis 单线程模型基于 Reactor 的文件事件处理器Redis 作为一款高性能的键值数据库其单线程模型常常令初学者困惑单线程为何能支撑如此高的并发答案就在于Reactor 模式与文件事件处理器的精妙设计。本文将带你一步步拆解 Redis 的核心事件驱动架构。一、背景Redis 为什么选择单线程Redis 采用单线程主要指网络 I/O 和命令执行的原因有避免上下文切换与锁竞争多线程的调度、加锁、解锁会带来额外开销。内存操作极快瓶颈通常不在 CPU而在网络 I/O。I/O 多路复用用一个线程同时监听多个 socket实现高并发。Redis 6.0 之后引入了多线程处理 I/O 写操作但核心命令执行依然是单线程本文聚焦于经典的单线程事件模型。二、Reactor 模式简述Reactor 模式是一种事件驱动架构它包含事件源如 socket 的可读、可写事件。多路复用器集中监听事件。事件分发器将就绪事件分发给对应的处理器。事件处理器实际执行业务逻辑。Redis 基于此模式开发了自己的文件事件处理器File Event Handler。三、文件事件处理器File Event Handler架构文件事件处理器由四个核心组件构成组件作用Socket网络通信端点客户端连接、读写操作的载体I/O 多路复用程序同时监听多个 socket当 socket 发生accept、read、write、close等操作时产生对应的文件事件文件事件分派器接收就绪的 socket 队列根据事件类型调用相应的事件处理器事件处理器具体处理业务逻辑包括连接应答处理器、命令请求处理器、命令回复处理器 提示Redis 封装了多种多路复用库epoll、kqueue、select在编译时自动选择性能最优的实现。组件关系图UML 组件图文件事件处理器就绪socket队列AE_READABLEAE_READABLEAE_WRITABLESocket1I/O多路复用程序Socket2SocketN文件事件分派器连接应答处理器命令请求处理器命令回复处理器客户端连接执行命令返回结果四、事件类型AE_READABLE 与 AE_WRITABLERedis 定义两种文件事件事件类型触发时机对应处理器AE_READABLEsocket 可读客户端连接请求、命令数据到达连接应答处理器、命令请求处理器AE_WRITABLEsocket 可写可以向客户端返回数据命令回复处理器⚠️ 注意如果一个 socket 同时可读可写Redis 优先处理读事件再处理写事件。五、完整工作流程Flowchart下图展示了从服务启动到处理一个客户端请求的完整流程否是AE_READABLE且为监听 socketAE_READABLE且为客户端 socketAE_WRITABLE是否服务启动创建 eventLoop 并初始化 I/O 多路复用绑定端口创建监听 socket注册监听 socket 的 AE_READABLE 事件绑定连接应答处理器进入事件循环等待事件发生有事件就绪?文件事件分派器取出就绪 socket事件类型?连接应答处理器创建客户端 socket注册客户端 socket 的 AE_READABLE 事件绑定命令请求处理器命令请求处理器读取并解析命令执行命令纯内存操作准备返回数据注册客户端 socket 的 AE_WRITABLE 事件绑定命令回复处理器命令回复处理器将数据写入 socket数据是否写完?注销 AE_WRITABLE 事件六、客户端与服务端交互时序图UML 时序图命令回复处理器命令请求处理器连接应答处理器文件事件分派器I/O多路复用程序客户端Socket监听Socket客户端命令回复处理器命令请求处理器连接应答处理器文件事件分派器I/O多路复用程序客户端Socket监听Socket客户端1. connect()产生 AE_READABLE就绪事件队列分发2. accept() 创建新socket注册 ClientSocket 的 AE_READABLE3. 发送命令(SET key value)产生 AE_READABLE就绪事件队列分发4. 读取、解析、执行命令注册 ClientSocket 的 AE_WRITABLE产生 AE_WRITABLE就绪事件队列分发5. 写入执行结果注销 AE_WRITABLE如果数据写完6. 返回响应七、单线程为何依然高效I/O 多路复用一个线程通过epoll等机制同时监听成千上万个 socket只在事件发生时进行处理避免了阻塞等待。纯内存操作Redis 数据存储在内存中读写速度极快纳秒级CPU 很少成为瓶颈。非阻塞 I/ORedis 内部对 socket 设置了非阻塞标志配合多路复用不会因为一个慢客户端阻塞整个服务。避免了上下文切换与锁单线程模型天然无竞争不需要锁保护数据结构也不会因线程切换消耗 CPU。八、总结关键点说明核心模式Reactor 模式 文件事件处理器核心组件Socket、I/O 多路复用程序、文件事件分派器、事件处理器事件类型AE_READABLE可读、AE_WRITABLE可写处理器连接应答处理器、命令请求处理器、命令回复处理器交互流程监听 socket → 接受连接 → 注册读事件 → 解析命令 → 执行 → 注册写事件 → 返回结果高效原因多路复用 内存操作 非阻塞 I/O 单线程无锁扩展思考Redis 6.0 引入的多线程 I/O 是如何在保留核心单线程的基础上提升大并发写入性能的参考资料Redis 官方文档Event library

更多文章