事件
Redis服务器是一个事件驱动程序,服务器需要处理两类事件:
文件事件
Redis基于Reactor模式开发了自己的网络事件处理器:文件事件处理器
文件事件处理器
多个文件事件可能会并发地出现,但I/O多路复用程序总是会将所有产生事件的套接字都放到一个队列里面,通过这个队列,有序、同步、每次一个套接字的方式向文件事件分派器传送套接字
文件分派器根据套接字产生的事件的类型,调用相应的事件处理器
事件处理器是一个个函数,定义了某个事件发生时,服务器应该执行的动作
I/O多路复用程序的实现
通过包装常见的select、epoll、evport和kqueue这些I/O多路复用函数库来实现的
事件的类型
I/O多路复用程序可以监听多个套接字的ae.h/AE_READABLE事件和ae.h/AE_WRITABLE,这两类事件和套接字操作之间的对应关系如下:
如果一个套接字又可读又可写的话,那么服务器将先读套接字,后写套接字
文件事件的处理器
连接应答处理器
Redis服务器进行初始化的时候,程序将这个连接应答处理器和服务器监听套接字的AE_READABLE事件关联起来
命令请求处理器
负责从套接字中读入客户端发送的命令请求内容
命令回复处理器
负责将服务器执行命令后得到的命令回复通过套接字返回给客户端
完整的通信过程
时间事件
时间事件分为两类:
时间事件由以下三个属性组成:
实现
服务器将所有时间事件都放在一个无序链表中,每当时间事件执行器运行时,遍历整个链表,查找所有已到达的时间事件,并调用相应的事件处理器
无序指的是不按when属性的大小排序,不是不按ID排序
应用实例:serverCron函数
定期对自身的资源和状态进行检查和调整,定期操作由redis.c/serverCron函数负责