Redis(七)——事件

Redis服务器是一个事件驱动程序,主要分文件事件和时间事件。

一、文件事件

Redis服务器通过套接字(IP+端口)与客户端(或其他redis服务器)进行连接,文件事件就是服务器对套接字操作的抽象。

1.文件事件处理器

每当一个套接字准备好执行连接应答、写入、读取、关闭操作时,就会产生一个文件事件。这些文件事件可能并发出现,但I/O多路复用程序总是会将产生事件的套接字放到队列里,以 有序、同步、每次一个套接字的方式向文件事件分派器传送套接字。当上一个套接字产生的事件被处理完才轮到下一个套接字。

服务器会为执行不同任务的套接字关联不同的事件处理器,这些处理器是一个个函数,定义了某个事件发生时,服务器应该执行的动作。

如果一个套接字又可读又可写时,服务器将先读后写。

处理器可以分为三种:连接应答处理器、命令请求处理器、命令回复处理器

2.客户端与服务器的通信过程

二、时间事件

Redis服务器一些关于时间操作的抽象。

1.分类

定时事件:指定时间后执行一次

周期性事件:隔指定时间就执行一次

2.属性组成

id:服务器为时间事件创建的全局唯一标识ID,从小到大递增,新事件的id比旧事件大。

when:毫秒精度的时间戳

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

3.实现

将所有时间事件都放在一个无序(id有序,when无序)链表中,每当时间事件执行器运行时,遍历链表,对已到达的时间时间调用相应的事件处理器。

4.实例

serverCron函数是正常模式下只运行的一个时间事件,主要工作是:

  • 更新服务器的各类统计信息,比如时间、内存占用、数据库占用情况等。
  • 清理数据库中的过期键值对。
  • 关闭和清理连接失效的客户端。
  • 尝试进行持久化操作。
  • 如果是主服务器,则对从服务器定期同步。
  • 如果处于集群模式,对集群进行定期同步和连接测试。

 

三、事件调度与执行

  • 文件事件随机出现,等待并处理完后,如果没有时间事件到达,那就继续等待处理文件事件。
  • 服务器对文件和时间事件的处理都是同步、有序、原子地执行,服务器不会中途中断事件处理,也不会抢占,因此,处理器尽可能减少程序的阻塞时间,并在需要时主动让出执行权。
  • 时间事件的实际执行时间一般比计划执行时间晚一点。

 参考&引用

《redis设计与实现》 

原文地址:https://www.cnblogs.com/shoulinniao/p/13798658.html