=================
== Time Stream ==
=================
一个小学生

Redis线程模型及事件

redis

Redis使用事件驱动模型,主要处理:文件事件,也就是和客户端的网络通信等等;以及时间事件,也就是一些定时任务之类的抽象。

文件事件

Redis基于Reactor模式,采用I/O多路复用来处理请求,以单线程来运行,可以实现高性能网络通信模型。

文件事件处理器组成:套接字、I/O多路复用程序、文件事件分派器、事件处理器。

event-1

I/O多路复用监听多个套接字,向文件事件派发器传送产生了事件的套接字,如果存在并发,I/O多路复用程序会将所有产生事件的套接字放到一个队列里,按顺序向事件派发器传送。派发器根据套接字产生的事件调用响应的事件处理器。

事件类型

  • AE_READABLE事件
  • AE_WRITABLE事件

服务器监听套接字的AE_READABLE事件,Redis客户端发起连接,会触发连接应答处理器执行,处理器会对客户端连接请求应答,然后创建客户端套接字,以及客户端状态,并将客户端套接字的AE_READABLE事件与命令请求关联,使得客户端可以向主服务器发送命令请求。

客户端向服务器发送一个命令请求,客户端套接字会产生一个AE_READABLE事件,引发命令请求处理器执行,处理器读取客户端命令,然后传给相应程序去执行。

执行命令后产生相应的回复,需要传回给客户端,服务器会将客户端套接字的AE_WRITABLE事件与命令处理回复处理器进行关联。

客户端尝试读取命令回复的时候,客户端套接字产生AE_WRITABLE事件,触发命令回复处理器执行,当命令回复处理器将命令全部写回套接字后,服务器就会解除客户端套接字的AE_WRITABLE事件与命令回复处理器间的关联。

时间事件

Redis使用周期性事件。

服务器将所有时间事件放到一个无序链表,每当时间事件执行器运行,会遍历链表,查找已到达的时间事件,并调用相关事件处理器。

参考

  • 《redis设计与实现》(第二版)