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;