Redis之事件模型
介绍 Memcached的底层网络驱动部分直接使用了libevent,其实Redis使用libevent也是可以,仅仅使用其 event_base 完全可以行得通。但是作者为什么需要自己造个轮子,可能作者觉得 libevent 封装得过于复杂实现的功能过多吧。这里区别一下Redis作者的 ae.c 和libevent的区别吧: libevent统一了三种事件的处理,IO事件、时间事件和信号事件,并且每个事件可以注册多个回调函数,事件之间具有优先级关系 (通过将就绪链表依据优先级设定为多条实现) 。而Redis仅仅统一了IO事件和事件事件,且一个事件fd只能注册一个回调函数,并且IO事件之间不具备优先级,按照epoll返回顺序依次执行。因此Redis的封装更加简单明了。 二者都是通过Reactor模式封装epoll了,所以实现起来,基本就是对一个大结构体操作。所以很容易实现。 再次发现,Redis的作者很喜欢造轮子。 实现 1、事件分发器及IO事件、定时事件结构体 通过三个结构体,直接看清楚这种Reactor模式实现起来多么容易。 时间事件通过单链表存储,内部存储距离1970年1月1日00:00:00的秒及微妙。每次时间事件是否需要处理就是通过获取当前时间,与存储的时间简单比较而已。因为先处理IO事件,所以加上处理IO事件的时间,就会导致时间事件的处理稍微推迟