redis: event loop
redis用一个event loop作为事件分发器(dispatcher),他的作用就是“挡在前面”,对应外界的IO。
涉及文件:
ae.h, ae.c, ae_epoll.c, ae_select.c, ae_kqueue.c
版本: 2.4.4 ae.c中定义了event loop的主体,剩余三个文件(ae_epoll.c, ae_select.c, ae_kqueue.c)分别是三种底层api的封装。对event loop来说,它们通过一组预定义的接口来通信,epoll、select、kqueue是底层的三种具体实现。 event loop处理两种类型的event:- 文件IO(Socket是一种文件IO)事件
- 定时器事件
-
文件事件(File Event)
-
定时器事件(Timer Event)
-
处理框架(aeProcessEventLoop)
- 找出当前event loop中最近一个需要触发的timer event,把时间记录下来,设为 t
- 调用底层的api,进行poll操作,进入睡眠(等待IO),并且把time out设定为t
- 如果有IO事件被触发,就调用对应的处理函数。当然,这里有个内部数据结构,把事件传递出来。
- 调用processTimeEvents,处理定时器事件