Redis服务器需要处理两类事件:文件事件和时间事件。
1、文件事件
Redis服务器通过套接字与客户端进行连接,而文件事件就是服务器对套接字操作的抽象。
Redis基于Reactor模式开发了网络事件处理器,由四部分组成:套接字、I/O多路复用程序、文件事件分派器以及事件处理器。
- 套接字:当有一个套接字准备好执行连接应答、写入、读取、关闭等操作时,就会产生一个文件事件(多个套接字就会有多个文件事件产生);
-
I/O多路复用程序:负责监听多个套接字,并向文件事件分派器传送产生事件的套接字。I/O多路复用的功能是evport、epoll、kqueue和select的包装。事件类型有AE_READABLE和AE_WRITABLE,如果一个事件即可读又可写,则先处理AE_READABLE事件,再处理AE_WRITABLE事件。I/O多路复用程序会将产生的所有事件的套接字放在一个队列中,以有序同步、每次一个套接字的方式向文件事件分派器传送套接字,只有一个套接字的事件处理完成后才会再发下一个:
- 文件事件分派器:根据套接字产生事件的类型,调用相应的事件处理器;
- 事件处理器:事件处理函数。
(1)连接应答处理器:封装了accept
(2)命令请求处理器:封装了read
(3)命令回复处理器:封装了write
2、时间事件
分类:
- 定时事件:让一段程序在指定时间后执行一次
- 周期性事件:让一段程序每隔指定时间就执行一次
属性:
- id:服务器为时间事件创建的全局唯一ID,顺序递增
- when:时间事件到达时间,毫秒级UNIX时间戳
- timeProc:时间事件处理器,一个函数
实现:服务器将时间事件都放在一个无序链表中(不是按时间顺序排序,而是按照ID排序,新产生的时间事件放在链表的表头),每次时间事件执行器运行时,它就遍历整个链表,查找所有已经到达的时间事件,并调用相应的事件处理器。