redis的事件分为两种事件:一个是文件事件,Redis基于Reactor模式开发了自己的网络事件处理器:这个处理器被称为文件事件处理器;另一个是时间事件,顾名思义,定时运行的事件和周期运行的事件。
在aeMain函数中调用了aeProcessEvents函数,它管理着所有事件的分发和调用。
aeApiPoll函数阻塞并等待所有被aeCreateFileEvent函数设置为监听状态的套接字产生文件事件,当有至少一个事件产生,或者等待超时后,函数返回。
事件概况
- initServer函数创建事件循环
server.el = aeCreateEventLoop();//创建事件循环
- initServer创建时间时间
aeCreateTimeEvent(server.el, 1, serverCron, NULL, NULL);//注册时间事件 serverCron回收一些垃圾 1毫秒后server.el事件到达,使用serverCron处理此事件
- main函数中创建服务器的最重要的文件事件,监听server.fd,当出现AE_READABLE类型事件采用acceptHandler函数处理事件
if (aeCreateFileEvent(server.el, server.fd, AE_READABLE,acceptHandler, NULL) == AE_ERR) oom("creating file event");//给服务器与接收句柄关联
- aeMain开启事件循环
主要事件的调度与处理都是在aeProcessEvents函数中进行,其中aeApiPoll堵塞,等待事件,之后处理已经到达的文件事件,再处理时间事件