1 简介

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

  • 文件事件(file event):Redis服务器通过套接字与客户端进行连接,而文件事件就是对套接字操作的抽象,可以将其理解为IO事件;Redis将产生事件套接字放入一个就绪队列中,即redisServer.aeEventLoop.fired数组,然后在aeProcessEvents会依次分派给文件事件处理器处理。

 

    Redis中文件事件包括客户端的连接、命令请求、数据回复、连接断开等,当上述事件发生时,会造成相应的描述符可读可写,再调用相应类型的文件事件处理器。

    文件事件处理器有:

      连接应答处理器networking.c/acceptTcpHandler

      命令请求处理器networking.c/readQueryFromClinet

      命令回复处理器networking.c/sendReplyToClient

 

  • 时间事件(time event):时间事件包含定时事件周期性事件,Redis将其放入一个单向无序链表中,每当时间事件执行器运行时,就遍历链表,查找已经到达的时间事件,调用相应的处理器。

    定时事件:让一段程序在指定的时间之后执行一次,比如让程序X在当前时间30ms之后执行一次;

    周期事件:让一段程序每隔指定时间就执行一次,比如让程序Y每隔30ms就执行一次;

2 文件事件的处理

  前文:Reactor事件模型在Redis中的应用 中,主要针对文件事件的处理,讲解了Reactor的事件模型。包括一下主要部件的实现:

2.1 事件分派器(Initiation Dispatcher):

  (1) 事件的管理(注册与删除等)

    1)通过结构体 struct aeFileEvent 建立文件事件(fd,mask)与相应事件处理器(callback function)的对应关系;

    2)在 struct aeEventLoop 中,通过 aeFileEvent *events; /*events数组下标与fd对应 */ 保存所有已注册的事件;  

/* File event structure */
typedef struct aeFileEvent {
    // 监听事件类型掩码,
    // 值可以是 AE_READABLE 或 AE_WRITABLE ,
    // 或者 AE_READABLE | AE_WRITABLE
    int mask; /* one of AE_(READABLE|WRITABLE) */

    // 读事件处理器
    aeFileProc *rfileProc;

    // 写事件处理器
    aeFileProc *wfileProc;

    // 多路复用库的私有数据
    void *clientData;

} aeFileEvent;
View Code

相关文章: