事件
Redis服务器是事件驱动程序,需要处理两种事件:
- 文件事件——服务器与客户端通信产生的事件
- 时间事件——Redis中类似serverCron函数的给定时间点执行的事件
文件事件
文件事件处理器使用I/O多路复用程序来同时监听多个套接字,根据套接字目前执行的任务来为套接字关联不同的事件处理器。
被监听的套接字准备好执行accept、read、write、close等操作时,与之相对应的文件事件就会产生,这时文件事件处理器就会调用套接字之前联系好的事件处理器来处理这些事件。
虽然文件事件处理器以单线程方式运行,但是通过使用I/O多路复用程序来监听多个套接字,文件事件处理器既实现了高性能的网络通信模型,又可以使用简单的单线程。
源码实现
相关源码:ae.h ae.c networking.c anet.c net.h ae_epoll.c ae_select.c ae_kqueue.c
ae.h、ae.c :event library具体实现
networking.c : 与客户端的交互
anet.h anet.c : 网络通信
ae_epoll.c ae_select.c ae_kqueue.c : 不同系统多路IO封装
- ae_epoll.c : linux平台
- ae_select.c :unix平台
- ae_kqueue.c : BSD、APPLE
/* Include the best multiplexing layer supported by this system.
* The following should be ordered by performances, descending. */
#ifdef HAVE_EVPORT
#include "ae_evport.c"
#else
#ifdef HAVE_EPOLL
#include "ae_epoll.c"
#else
#ifdef HAVE_KQUEUE
#include "ae_kqueue.c"
#else
#include "ae_select.c"
#endif
#endif
#endif
多路IO封装:
- aeApiCreate:创建句柄(epoll_create)
- aeApiFree:关闭句柄(close)
- aeApiAddEvent:事件添加(epoll_ctl)
- aeApiDelEvent:事件删除(epoll_ctl)
- aeApiPoll:等待事件发生(epoll_wait)
初始化事件处理器状态的过程:创建事件状态结构aeEventLoop,aeEventLoop中包括文件事件结构数组、已就绪文件事件结构数组、最近执行时间、时间事件结构和一些标志位。aeEventLoop是一个事件循环。