Redis中的IO多路复⽤机制
一、引⾔
提起Redis,我们经常会说其底层是⼀个单线程模型,但这是不严谨的。Redis 单线程指的是⽹络请求模块使⽤了⼀个线程,即⼀个线程处理所有⽹络请求,其他模块该使⽤多线程,
仍会使⽤了多个线程。既然是单线程模型,那么CPU不是Redis的瓶颈。Redis的瓶颈最有可能是机器内存或者⽹络带宽。
二、Redis中的单线程模型
Redis基于Reactor模式开发了⾃⼰的⽹络事件处理器,称之为⽂件事件处理器(File Event Hanlder)。⽂件事件处理器由Socket、IO多路复⽤程序、⽂件事件分派器(dispather),事件处理器(handler)四部分组成。关于IO多路复⽤的相关知识,这⽅⾯可以参考我之前的,这⾥就不多解释了。⽂件事件处理器的模型如下所⽰:
IO多路复⽤程序会同时监听多个socket,当被监听的socket准备好执⾏accept、read、write、close等操作时,与这些操作相对应的⽂件事件就会产⽣。IO多路复⽤程序会把所有产⽣事件的socket压⼊⼀个队列中,然后有序地每次仅⼀个socket的⽅式传送给⽂件事件分派器,⽂件事件分派器接收到socket之后会根据socket产⽣的事件类型调⽤对应的事件处理器进
⾏处理。
⽂件事件处理器分为⼏种:
- 连接应答处理器:⽤于处理客户端的连接请求;
- 命令请求处理器:⽤于执⾏客户端传递过来的命令,⽐如常见的set、lpush等;
- 命令回复处理器:⽤于返回客户端命令的执⾏结果,⽐如set、get等命令的结果;
事件种类:
- AE_READABLE:与两个事件处理器结合使⽤。
- 当客户端连接服务器端时,服务器端会将连接应答处理器与socket的AE_READABLE事件关联起来;
- 当客户端向服务端发送命令的时候,服务器端将命令请求处理器与AE_READABLE事件关联起来;
- AE_WRITABLE:当服务端有数据需要回传给客户端时,服务端将命令回复处理器与socket的AE_WRITABLE事件关联起来。
三、Redis的客户端与服务端的交互过程如下所⽰:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了