Redis单线程模型

Redis事件

Redis服务器是一个事件驱动程序,服务器需要处理一下两类事件:

  • 文件事件:Redis服务器通过套接字与客户端进行连接,而文件事件就是服务器对套接字操作的抽象。服务器与客户端的通信会产生相应的文件事件,而服务器则通过监听并处理这些事件来完成一系列网络通信操作。
  • 时间事件:Redis服务器中的一些操作需要在给定的时间点执行,而时间事件就是服务器对这类定时操作的抽象。

文件事件

Redis基于Reactor模式开发了自己的网络事件处理器:这个处理器被称为文件事件处理器:

文件事件处理器是单线程的

  • 文件事件处理器使用了I/O多路复用程序来同时监听多个套接字,并根据套接字目前执行的任务关联不同的事件处理器。
  • 当被监听的套接字准备执行连接应答、读取、写入、关闭等操作时,与操作相应的文件事件就会产生,这是文件事件处理器就会调用之前关联好的事件处理器来处理这些事件。

文件事件处理器的构成

下图展示了文件处理器的四个组成部分,它们分别是套接字、I/O多路复用程序、文件事件分派器、以及事件处理器。
Redis单线程模型

  1. 文件事件是对套接字操作的抽象,每当一个套接字准备执行连接应答、写入、读取、关闭等操作时,就会产生一个文件事件。即一个客户端会产生多个文件事件。
  2. I/O多路复用程序负责监听多个套接字,并向文件事件分派器传送那些产生了事件的套接字。
  3. 多个文件事件可能会并发的出现,但是I/O多路复用程序总是会将所有产生事件的套接字都放到一个队列里,然后通过这个队列,以有序、同步、每次一个套接字的方式向文件事件分派器传送套接字。只有当上一个套接字产生的事件被处理完毕,才会传送下一个。
    Redis单线程模型

事件的类型

  • 当套接字变得可读时或者有新的可应答套接字出现时,套接字产生AE_READABLE事件
  • 当套接字变得可写时,套接字产生AE_WRITABLE事件。