redis服务器是一个事件驱动程序,服务器总体来说可以分为两种事件:文件事件和时间事件,下面根据这两种事件分别进行介绍
总结自redis设计与实现一书
文件事件
上图:
可以看到,文件事件处理器由四部分组成:分别是套接字,io多路复用程序,多路复用分派器和各种不同的事件处理器组成。
套接字
可以理解为不同的客户端请求
io多路复用程序
redis统一封装了常见的io多路复用函数,譬如select,epoll,evport,和kqueue,并且提供了相同的api(多态?策略设计模式?),导致redis程序会在编译时候自动选择系统中性能最高的io多路复用程序来作为redis的io多路复用程序的底层实现,多路复用程序底层维护了一个队列,只有处理完一个socket请求,下一个socket请求才会转发给文件事件分配器,也体现了redis单线程处理的工作线程为单线程处理。
文件事件分派器
负责接受io多路复用程序穿来的socket,并感觉套接字产生的事件类型调用不同的事件处理器。
事件处理器
请求处理器,回复处理器,连接处理器等
时间事件
时间事件分为两类:
定时事件:让程序在指定的时间执行
周期性事件 : 让程序周期性执行,每隔一定时间执行一次
redis目前只有周期性事件,没有定时事件,且周期性事件只有servercron一个事件。区分在于调用不同的事件返回的的值,如果返回一个整数值,则会更新下次时间事件到达的时间。为周期性事件,如果返回ae.h/AE_NOMORE,该事件在到达之后会删除对应的时间。
servercron作用:
- 更新服务器的各类统计信息,比如时间、内存占用、数据库占用情况等
- 清理数据库中的过期键值对
- 对不合理的数据库进行大小调整
- 关闭和清理连接失效的客户端
- 尝试进行 AOF 或 RDB 持久化操作
- 如果服务器是主节点的话,对附属节点进行定期同步
- 如果处于集群模式的话,对集群进行定期同步和连接测试