Redis服务器是一个事件驱动程序,主要分文件事件和时间事件。
一、文件事件
Redis服务器通过套接字(IP+端口)与客户端(或其他redis服务器)进行连接,文件事件就是服务器对套接字操作的抽象。
1.文件事件处理器
每当一个套接字准备好执行连接应答、写入、读取、关闭操作时,就会产生一个文件事件。这些文件事件可能并发出现,但I/O多路复用程序总是会将产生事件的套接字放到队列里,以 有序、同步、每次一个套接字的方式向文件事件分派器传送套接字。当上一个套接字产生的事件被处理完才轮到下一个套接字。
服务器会为执行不同任务的套接字关联不同的事件处理器,这些处理器是一个个函数,定义了某个事件发生时,服务器应该执行的动作。
如果一个套接字又可读又可写时,服务器将先读后写。
处理器可以分为三种:连接应答处理器、命令请求处理器、命令回复处理器
2.客户端与服务器的通信过程
二、时间事件
Redis服务器一些关于时间操作的抽象。
1.分类
定时事件:指定时间后执行一次
周期性事件:隔指定时间就执行一次
2.属性组成
id:服务器为时间事件创建的全局唯一标识ID,从小到大递增,新事件的id比旧事件大。
when:毫秒精度的时间戳
timeProc:时间事件处理器,一个函数。当时间事件到达时,服务器就会调用相应的处理器来处理事件。
3.实现
将所有时间事件都放在一个无序(id有序,when无序)链表中,每当时间事件执行器运行时,遍历链表,对已到达的时间时间调用相应的事件处理器。
4.实例
serverCron函数是正常模式下只运行的一个时间事件,主要工作是:
- 更新服务器的各类统计信息,比如时间、内存占用、数据库占用情况等。
- 清理数据库中的过期键值对。
- 关闭和清理连接失效的客户端。
- 尝试进行持久化操作。
- 如果是主服务器,则对从服务器定期同步。
- 如果处于集群模式,对集群进行定期同步和连接测试。
三、事件调度与执行
- 文件事件随机出现,等待并处理完后,如果没有时间事件到达,那就继续等待处理文件事件。
- 服务器对文件和时间事件的处理都是同步、有序、原子地执行,服务器不会中途中断事件处理,也不会抢占,因此,处理器尽可能减少程序的阻塞时间,并在需要时主动让出执行权。
- 时间事件的实际执行时间一般比计划执行时间晚一点。
参考&引用
《redis设计与实现》