redis系列-事件
2017-06-27 20:00
148 查看
事件类型
redis有2种事件:时间事件和文件时间。redis没有使用操作系统的定时器,而是自己时间了一套时间机制,这套机制用时间事件来管理。文件事件则是套接字IO相关的事件。
数据结构
事件核心管理器是aeEventLoop,结构中有时间事件链表头指针、文件事件句柄、事件前处理接口等信息。
redis启动时,会分配这么一个事件管理器,同时分配一个长度为N的文件事件数组,N的值为客户端最大数量(默认为10000)+128(32个位预留的),
文件事件
在事件管理器aeEventLoop中,与文件事件相关的变量如下:typedef struct aeEventLoop {
int maxfd; /* highest file descriptor currently registered */
int setsize; /* max number of file descriptors tracked */
aeFileEvent *events; /* Registered events */
aeFiredEvent *fired; /* Fired events */
void *apidata; /* This is used for polling API specific data */
} aeEventLoop;maxfd:当前已经使用的最大的文件事件id,也即文件事件数组索引
setsize:events数组大小
events:文件事件数组,所有的文件事件都在这里
fired:文件数据数组,用于保存从epoll/select中返回的实际发生的文件事件
每当创建一个文件事件时,根据事件id从events占据一个元素,并设置该元素的mask、读回调方法、写回调方法等。当epoll等返回已经发生的事件时,通过fired数组返回
这里只分析IO复用使用epoll的情况,epoll_wait超时或者有事件发生时返回,遍历所有epoll_event事件,从中取出文件描述符,并且将事件类型转换为redis的文件事件(例如EPOLLIN对应AE_READABLE,EPOLLOUT、EPOLLERR、EPOLLHUP都对应AE_WRITABLE),保存到fired中对应的事件。
分配events数组时,默认长度是10128,其中10000是客户端最大数量,调用epoll_create创建epoll时,入参是1024,远远低于客户端数量,经过查资料才知道,epoll_create的入参在linux2.4之前用于分配hash保存文件句柄,而linux2.6之后epoll采用红黑树保存句柄,因此不需要明确长度,因此epoll支撑的文件句柄将会非常多
时间事件
时间事件处理比较简单,遍历时间列表,找出距离当前时间最近的定时器,将时间差换算为timeval结构,作为IO复用接口等待的时间。这样设计有2个好处:1.如果有事件发生在超时之前,则进程不需要继续睡觉就能立刻处理事件。处理完事件也会继续处理时间事件,避免定时器被“饿”着
2.如果在时间超时后依然没有事件发生,redis也可以从容处理定时器
相关文章推荐
- Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群
- Redis系列(三)---事件处理细节分析及epoll介绍
- Redis系列—Redis事件订阅
- Microsoft .Net Remoting系列专题之三 Remoting事件处理全接触
- DataGrid系列技巧(导出excel,事件,多种方式呈现数据,全选全删)等等等
- [转] 魔兽系列事件报道
- Vml:美洲豹系列教程之十(给VML增加事件)
- DataGrid系列技巧(导出excel,事件,多种方式呈现数据,全选全删)等等等
- Microsoft .Net Remoting系列专题之三:Remoting事件处理全接触
- Microsoft .Net Remoting系列专题之三:Remoting事件处理全接触
- Microsoft .Net Remoting系列专题之三:Remoting事件处理全接触
- [笔记系列]jsp响应回车事件
- Microsoft .Net Remoting系列专题之三:Remoting事件处理全接触
- 《WF编程》系列之16 - 工作流与外部世界:生存周期事件
- 探索VB系列中的事件处理的奥秘
- .NET基础示例系列之六:委托及事件
- Microsoft .Net Remoting系列专题之三:Remoting事件处理全接触
- Mach-II DevGuide 系列教程译文: 事件过滤器的设计
- DataGrid系列技巧(导出excel,事件,多种方式呈现数据,全选全删)等等等 (转)
- Microsoft .Net Remoting系列专题之三:Remoting事件处理全接触