第12章 事件
Redis为事件驱动程序,通过套接字与客户端进行连接。
套接字操作抽象为文件事件。
周期性操作抽象为时间事件。
12.1 文件事件
1>使用IO多路复用同时监听多个套接字,并根据套接字任务关联不同的时间处理器。
2>当被监听的套接字准备好操作时,文件事件处理器调用之前关联的事件处理器进行处理。
12.1.1 文件事件处理器的构成
由嘶部分组成:
12.1.2 I/O多路复用程序的实现
使用了常见的函数库【后面得找时间好好学习一下IO多路复用的实现原理】。
12.1.3 事件的类型
1>当客户端执行连接、写操作、关闭连接时,套接字为可读事件。
2>当客户端执行读操作时,套接字为可写事件。
3>当一个套接字同时可读可写时,会先读套接字,再写套接字。
12.1.5 文件事件的处理器
1>连接应答处理器:accept客户端的connect。
2>命令请求处理器:read并执行客户端写入的请求。
3>命令回复处理器:回复命令执行结果。
12.2 时间事件
1>定时事件
2>周期事件
12.2.1 实现
将时间事件放入一个无序链表中,每次遍历来找到相应的到时事件进行执行。
(PS:因为事件少,所以遍历不影响性能,否则应使用小顶堆进行实现)
12.2.2 API
略,P157。
12.2.3 时间事件应用实例:serverCron函数
默认100毫秒执行一次:
1>更新服务器统计信息。
2>清理过期键。
3>关闭与清理连接失效客户端。
4>尝试进行AOF或RDB持久化操作。
5>如果服务器是主服务器,与从服务器进行同步。
6>对集群定期同步与连接测试。
12.3 事件的调度与执行
1>事件有序、原子的执行,不会中断及抢占。
2>会先处理文件事件,处理完之后处理时间事件,一般情况下时间事件的处理都会比预设时间晚一些。