Redis事件处理器

1,269 阅读2分钟

Redis事件处理器

原文链接: segmentfault.com/a/119000002…

Redis采用事件驱动机制来处理大量的网络IO。它自己实现了一个事件驱动库ae_event。

Redis中的事件驱动库只关心网络IO,以及定时器。该事件库处理下面两类事件:

  • 文件事件(file event):用于处理Redis服务器和客户端之间的网络IO。
  • 时间时间(time event):Redis服务器中的一些操作(比如serverCron函数)需要在给定的时间执行,而时间事件就是处理这类定时操作的。

aeEventLoop是整个事件驱动的核心,它管理着文件事件表和时间事件表,不断地循环处理就绪的文件事件和到期的时间事件。

文件事件

Redis基于Reactor模式开发了自己的网络事件处理器,也就是文件事件处理器。文件事件处理器使用IO多路复用技术,同时监听多个套接字,并为套接字关联不同的事件处理函数。当套接字就绪后,就会调用相应的事件处理函数。

文件事件处理器由IO多路复用程序、文件事件分派器和事件处理器组成。

文件事件是对套接字操作的抽象,每当一个套接字准备好执行accept/read/write和close等操作时,就会产生一个文件事件。因为Redis通常会连接多个套接字,所以多个文件事件有可能并发地出现。IO多路复用程序负责监听多个套接字,并向文件事件派发器传递那些产生了事件的套接字。

IO多路复用器将所有产生的套接字都放到同一个队列(aeEventLoop的fired就绪事件表)里,然后文件事件处理器会逐个有序处理该队列中的就绪事件。

时间事件

Redis的时间事件分为以下两类:

  • 定期事件:让一段程序在指定时间之后执行一次。
  • 周期性事件:让一段程序每隔指定时间就执行一次。

Redis将所有时间事件都放在一个无序链表中,每次Redis都会遍历整个链表,查找所有已经到达的事件事件,并且调用相应的事件处理器。