Redis学习笔记(四)| 青训营笔记

74 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 18 天

五、Redis的事件

1、文件事件

Redis基于Reactor模式开发了自己的网络事件处理器,这个处理器就成为文件事件处理器。

  • 文件事件处理器使用I/O多路复用来监听多个套接字,并根据套接字目前执行的任务来为套接字关联不同的事件处理器。套接字被存到一个队列里,如此才能满足Redis单线程模型。
  • 连接应答处理器

当服务器初始化的时候,程序会将Redis的连接应答器和服务器监听套接字的ae_readable事件关联起来。总的来说就是处理客户端和服务端的连接请求。

  • 命令请求处理器

连接应答处理器连接到服务器的Socket事件,之后客户端发送命令,则会触发命令请求处理器

  • 命令回复处理器

之后返回结果,则会调用命令回复处理器,当消息发送完毕则断开与命令恢复处理器的时间关联

2、时间事件

时间事件的属性

id:全局唯一ID号

when:毫秒精度的UNIX时间戳

timeProc:时间事件处理器,当时间事件到达以后,服务器就会调用相应的处理器来处理事件。

  • 定时事件(Redis设计与实现上说他那个版本没有定时事件只有周期性时间)
  • 周期性时间

时间事件的实现

服务器将所有的时间事件放到一个无序链表中,每当时间事件执行器运行时,就会遍历整个链表,查找整个链表,查找所有已到达的时间事件,并调用相应的事件处理器。

在目前版本(Redis设计与实现)中,正常模式下的Redis服务器只使用serverCron一个时间事件,而在benchmark模式下,服务器也只使用两个时间事件。在这种情况下,服务器几乎是将无序链表退化成一个指针来使用,所以使用无序链表来保存时间事件,并不会影响事件的性能。(面试可能会问到)

正常模式下的唯一时间事件:serverCron

这个函数主要是周期性运行来确保服务器的资源是否正常

更新服务器的各类统计信息

清理数据库中的过期键值对

关闭和清理连接失效的客户端

尝试进行AOF或RDB持久化操作

如果服务器是主服务器,那么对从服务器进行定期同步

如果处于集群模式,对集群继续定期同步和连接测试

在Redis2.6,默认每秒运行10次,2.8开始可以修改配置而更改运行频率

3、事件的调度与执行

  1. 获取离当前时间最近的时间事件来当做阻塞的长度
  2. 因为文件事件是随机出现的,所以一般会处理完文件事件以后,没有时间事件到达,那么就继续处理文件事件
  3. 文件事件和时间事件是同步的,原子性的,有序的,是非抢占式的,所以不会造成饥饿
  4. 因为时间事件都是在文件事件之后执行,那么这个文件事件如果执行的时间过长,那么时间事件只能等待,所以一般周期性事件都比设定的要迟一点