文件事件:Redis服务器通过套接字和客户端进行连接,文件事件就是服务器对接套接字操作的抽象。服务器和客户端的通信会产生相应的文件事件,服务器通过监听并处理这些事件来完成通信。
Redis基于Reactor模式开发的事件处理机制,被称为文件事件处理器。由套接字、I/O多路复用程序、文件事件分派器(dispatcher),事件处理器组成。
IO多路复用程序同时监听多个socket,当被监听的socket准备好执行accep、read、write、close等操作时,与这些操作对应的文件事件就会产生。
IO多路复用程序会将这些事件的socket压入一个队列中,然后有序地每次仅一个socket的方式传送给文件事件分派器。
文件事件分派器接收到socket之后会根据socket产生的事件类型调用对应的事件处理器(即处理函数)进行处理。
事件的类型
IO多路复用程序监听多个套接字的ae.h/AE_READABLE事件和ae.h/AE_WRITABLE事件。
AE_READABLE事件:当套接字变得可读时(客户端对套接字执行write操作,或者执行close操作),或者有新的可应答套接字出现时(客户端对服务器的监听套接字执行了connect操作)
AE_WRITABLE事件:当套接字变得可写时(客户端对套接字执行read操作)
文件事件处理器
- 连接应答处理器:用于处理客户端的连接请求,连接处理函数acceptTCPHandler;
当Redis服务器初始化的时候,程序会将这个连接应答处理器和服务器监听套接字的AE_READABLE事件关联,当有客户端连接套接字的时候,服务端套接字就会产生AE_READABLE时间,引发连接应答处理器执行,并执行相应的套接字应答操作。
- 命令请求处理器:用于执行客户端传递过来的命令,请求处理函数readQueryFromClient;
当客户端成功连接服务器后,服务器会将客户端套接字的AE_READABLE事件和命令请求处理器关联,当客户端向服务器发送命令请求时,套接字就会产生AE_READABLE事件,引发命令请求处理器执行,并执行相应的套接字读入操作。
- 命令回复处理器:用于返回客户端命令的执行结果,回复处理函数sendReplyToClient;
当服务器有命令回复需要传送给客户端时,服务器会将客户端套接字的AE_WRITABLE事件和命令回复处理器关联,当客户端准备好接收服务器响应时,就会产生AE_WRITABLE事件,引发命令回复处理器执行,并执行相应的套接字写入操作。
客户端和服务器通信过程
Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程。由于事件处理机制是单线程进行的,所有的命令都会进入一个队列中,然后逐个被执行。
6.0之后多线程模型
- 主线程获取 socket 放入等待列表
-
将 socket 分配给各个 IO 线程(并不会等列表满)
-
主线程阻塞等待 IO 线程(多线程)读取 socket 完毕
-
主线程执行命令 - 单线程(如果命令没有接收完毕,会等 IO 下次继续)
-
主线程阻塞等待 IO 线程(多线程)将数据回写 socket 完毕(一次没写完,会等下次再写)
-
解除绑定,清空等待队列