一、概述
Redis线程模型主要是基于Reactor模式开发的网络事件处理器,这个处理器被称为文件事件处理器(file event handler),也就是说Redis线程模型指的就是文件事件处理器。文件事件处理器是单线程模式运行的,所以也叫单线程模型。但是通过IO多路复用机制监听多个socket,可以实现高性能的网络通信模型,又可以跟内部其他单线程的模块进行对接,保证了redis内部的线程模型的简单性。
二、文件事件类型
三、文件事件处理器组成部分
- 连接应答处理器:负责客户端的接入操作。
- 命令请求处理器:当客户端接入成功后,负责处理客户端发送的读、写等请求命令。
- 命令回复处理器:当处理完客户端发送的请求命令后,将执行的结果返回给客户端。
四、文件事件处理通信流程

(1)连接流程:

- 首先在redis启动初始化的时候,redis中的I/O多路复用程序会监听serverSocket并且将事件处理器中的连接应答处理器和AE_READABLE事件关联起来。
- 当客户端跟redis发起连接时,serverSocket会产生一个AE_READABLE事件,然后被I/O多路复用程序监听到后传递给文件事件分派器。
- 文件事件分派器再分配给redis初始化时与AE_READABLE事件关联的连接应答处理器去处理。
- 连接应答处理器完成与客户端的连接后,会创建一个与客户端一 一对应的socket,同时将这个socket的AE_READABLE事件跟命令请求处理器关联起来,后续该客户端的所有请求都是在这个socket上进行操作。我们可以把这个新建的socket叫作socket01,以便与其他客户端连接成功生成的socket进行区分,不同的客户端与serverSocket完成连接后都会创建一个与之一一对应的socket。
(2)命令执行流程:

- 客户端发送一个set key value命令到socket01。
- socket01会产生一个AE_READABLE(读事件)事件。
- I/O多路复用程序监听到socket产生的AE_READABLE事件。
- I/O多路复用程序将该事件放入到socket队列中。
- 文件事件分派器读取socket队列中的事件,将该socket中的命令交给与该事件关联的命令请求处理器去处理。
- 命令请求处理器读取socket01中的请求命令并执行完该命令后,会准备好需要返回给客户端的数据,并将socket01的AE_WRITABLE事件和命令回复处理器关联起来。
- 当客户端准备接收redis返回的数据时,会产生一个AE_WRITABLE事件,该事件被I/O多路复用程序监听到后放入socket队列中,再由文件事件分派器分配给该事件关联的命令回复处理器去处理。
- 命令回复处理器将待返回到客户端的数据写入到socket01中,写入完成之后会删除这个socket01的AE_WRITABLE事件和命令回复处理器的关联。
- socket01最终将命令处理的结果返回到客户端,完成一次命令的执行流程。
五、单线程模型的优缺点
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/206916.html原文链接:https://javaforall.net
