目录
文件事件处理器 文件事件
事件处理器客户端与 redis 通信的一次流程 为啥 redis 单线程模型也能效率这么高?
redis 的线程模型
文件事件处理器
redis 基于 reactor 模式开发了网络事件处理器,这个处理器叫做文件事件处理器,file event handler。这个文件事件处理器,是单线程的,redis 才叫做单线程的模型,采用 IO 多路复用机制同时监听多个 socket,根据 socket 上的事件来选择对应的事件处理器来处理这个事件。
如果被监听的 socket 准备好执行 accept、read、write、close 等操作的时候,跟操作对应的文件事件就会产生,这个时候文件事件处理器就会调用之前关联好的事件处理器来处理这个事件。
文件事件处理器是单线程模式运行的,但是通过 IO 多路复用机制监听多个 socket,可以实现高性能的网络通信模型,又可以跟内部其他单线程的模块进行对接,保证了 redis 内部的线程模型的简单性。
文件事件处理器的结构包含 4 个部分:多个 socket,IO 多路复用程序,文件事件分派器,事件处理器(命令请求处理器、命令回复处理器、连接应答处理器,等等)。
多个 socket 可能并发的产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程序会监听多个 socket,但是会将 socket 放入一个队列中排队,每次从队列中取出一个 socket 给事件分派器,事件分派器把 socket 给对应的事件处理器。然后一个 socket 的事件处理完之后,IO 多路复用程序才会将队列中的下一个 socket 给事件分派器。文件事件分派器会根据每个 socket 当前产生的事件,来选择对应的事件处理器来处理。
文件事件
- 当 socket 变得可读时(比如客户端对 redis 执行 write 操作,或者 close 操作),或者有新的可以应答的 sccket 出现时(客户端对 redis 执行 connect 操作),socket 就会产生一个AE_READABLE 事件。
- 当 socket 变得可写的时候(客户端对 redis 执行 read 操作),socket 会产生一个 AE_WRITABLE 事件。
- IO 多路复用程序可以同时监听 AE_REABLE 和 AE_WRITABLE 两种事件,要是一个 socket 同时产生了 AE_READABLE 和 AE_WRITABLE 两种事件,那么文件事件分派器优先处理 AE_REABLE 事件,然后才是 AE_WRITABLE 事件。
事件处理器
- 如果是客户端要连接 redis,那么会为 socket 关联连接应答处理器
- 如果是客户端要写数据到 redis,那么会为 socket 关联命令请求处理器
- 如果是客户端要从 redis 读数据,那么会为 socket 关联命令回复处理器
客户端与 redis 通信的一次流程
- 在 redis 启动初始化的时候,redis 会将连接应答处理器跟 AE_READABLE 事件关联起来,
- 接着如果一个客户端跟 redis 发起连接,此时会产生一个 AE_READABLE 事件,然后由连接应答处理器来处理跟客户端建立连接,创建客户端对应的 socket,同时将这个 socket 的 AE_READABLE 事件跟命令请求处理器关联起来。
- 当客户端向 redis 发起请求的时候(不管是读请求还是写请求,都一样),首先就会在 socket 产生一个 AE_READABLE 事件,然后由对应的命令请求处理器来处理。这个命令请求处理器就会从 socket 中读取请求相关数据,然后进行执行和处理。
- 接着 redis 这边准备好了给客户端的响应数据之后,就会将 socket 的 AE_WRITABLE 事件跟命令回复处理器关联起来,当客户端这边准备好读取响应数据时,就会在 socket 上产生一个 AE_WRITABLE 事件,会由对应的命令回复处理器来处理,就是将准备好的响应数据写入 socket,供客户端来读取。命令回复处理器写完之后,就会删除这个 socket 的 AE_WRITABLE 事件和命令回复处理器的关联关系。
为啥 redis 单线程模型也能效率这么高?
- 纯内存操作
- 核心是基于非阻塞的 IO 多路复用机制
- 单线程反而避免了多线程的频繁上下文切换问题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2020-12-17 mysql 基本数据类型