版本:3.0.7
1.源码
ae.h
ae.c
ae_epoll.c
ae_evport.c
ae_kqueue.c
ae_select.c
2.数据结构
/*
* 文件事件结构
*/
/* File event structure */
typedef struct aeFileEvent {
// 监听事件类型掩码
int mask; /* one of AE_(READABLE|WRITABLE) */
// 读事件处理器
aeFileProc *rfileProc;
// 写事件处理器
aeFileProc *wfileProc;
// 事件私有数据
void *clientData;
} aeFileEvent;
/*
* 时间事件结构
*/
/* Time event structure */
typedef struct aeTimeEvent {
// 时间事件的唯一标识符
long long id; /* time event identifier. */
// 事件的到达时间
long when_sec; /* seconds */
long when_ms; /* milliseconds */
// 事件处理函数
aeTimeProc *timeProc;
// 事件释放函数
aeEventFinalizerProc *finalizerProc;
// 事件私有数据
void *clientData;
// 指向下个时间事件结构,形成链表
struct aeTimeEvent *next;
} aeTimeEvent;
/*
* 已就绪事件
*/
/* A fired event */
typedef struct aeFiredEvent {
// 已就绪文件描述符
int fd;
// 事件类型掩码,
// 值可以是 AE_READABLE 或 AE_WRITABLE
// 或者是两者的或
int mask;
} aeFiredEvent;
/*
* 事件处理器
*/
/* State of an event based program */
typedef struct aeEventLoop {
// 已注册的最大文件描述符
int maxfd; /* highest file descriptor currently registered */
// 追踪的最大文件描述符个数
int setsize; /* max number of file descriptors tracked */
// 用于生成时间事件 id
long long timeEventNextId;
// 最后一次执行时间事件的时间
time_t lastTime; /* Used to detect system clock skew */
// 已注册的文件事件
aeFileEvent *events; /* Registered events */
// 已就绪的文件事件
aeFiredEvent *fired; /* Fired events */
// 时间事件
aeTimeEvent *timeEventHead;
// 事件处理器的开关
int stop;
// 多路复用库的私有数据(每个多路复用库的数据结构不一样,需要保存的数据也不一样)
void *apidata; /* This is used for polling API specific data */
// 在处理事件前要执行的函数
aeBeforeSleepProc *beforesleep;
} aeEventLoop;
3.内存分布,假设多路复用库是epoll
4.一些特性
4.1 redis根据系统因素自动选择多路复用库,将多路服用库包装了起来,对外的api是一致的
4.2 redis时间事件记录在单向链表中
4.3 文件事件分为读事件和写事件
4.4 时间事件分为定时事件和周期性事件
End;