【学习Redis系列】Redis中事件

Redis服务器主要由事件驱动。具体可分文件事件,时间事件。一个大致的关系如下图。


1.文件事件

文件事件,通过I/O多路复用,实现一个高性能通信模型。这个Redis将select,epoll,kqueue,evport,iocp进行封装,使用一个相同的API进行操作,程序在编译时自动选择系统中性能最高的I/O多路复用库来作为Redis的I/O多路复用程序的底层实现。在ae.c 文件中。


2.时间事件

时间事件保存在一个链表中,当时间事件执行器(理解为遍历查找  到达触发时间的时间事件  的一段代码)执行时,遍历整个链表,查找到达触发时间的事件,调用相应的时间事件处理器。


3.事件的调度与执行

文件事件与时间事件的具体调度由 ae.c / aeProcessEvents函数负责。

具体流程:首先redis.c 的 main 函数 调用 ae.c /  aeMain函数

在这个aeMain的while循环中会一直调用 aeProcessEvents 处理服务器的事件。如下图所示,节选了这个函数中的部分代码。

因为Redis服务器是单线程服务器,对事件的处理都是同步,有序,原子地执行,服务器不会中途中断,也不会对事件进行抢占。并且文件事件,时间事件都会尽可能减少阻塞系统的时间,并在有需要时让出执行权,降低造成事件饥渴的可能性。

比如时间事件中的serverCron在执行AOF或RDB持久化时,会采用子进程方式进行。时间事件通常会比预设事件稍微晚一点处理,也是因为文件事件会先执行后,才执行时间事件。

 

posted @ 2020-02-03 22:02  卡妙sama  阅读(166)  评论(0)    收藏  举报