redis事件
redis服务器是一个事件驱动程序,服务器需要处理文件事件和时间事件。
redis基于reacror模式开发了自己的网络事件处理器:文件事件处理器,使用I/O多路复用程序来同时监听多个套接字,并根据套接字目前执行的任务来为套接字关联不同的事件处理器。
每当一个套接字准备好执行连接应答,写入,读取,关闭等操作时,就会产生一个文件事件。
尽管多个文件事件可能会并发地出现,但I/O多路复用程序总是会将所有产生事件的套接字都放到一个队列里面,然后通过这个队列,以有序,同步每次一个套接字的方式向文件事件分派器传送套接字。当上一个套接字产生的事件被处理完毕之后(该套接字为事件所关联的事件处理器执行完毕),I/O多路复用程序才会继续向文件事件分派器传送下一个套接字。
时间时间分为定时事件和周期性事件:
定时事件:该事件在达到一次之后就会被删除,之后不再到达。
周期事件:当一个时间事件到达之后,服务器会根据事件处理器返回值,对时间事件的when属性进行更新让这个事件在一段时间之后再次到达。
服务器将所有时间事件都放在一个无序链表中(when时间无序),每当时间事件执行器运行时,它就遍历整个链表,查找所有已到达的时间事件。
以serverCron函数为例,serverCron工作包括:
1.更新服务器的各类统计信息
2.清理数据库中的过期键值对
3.关闭和清理链接失效的客户端
4.尝试进行AOF或RDB持久化操作。
5.如果服务期是主服务器,那么对从服务器进行定期同步。
6.如果处于集群模式,对集群进行定期同步和连接测试。
serverCron周期性的执行,直到服务器关闭,2.8开始conf中hz配置。

时间事件和文件时间如何调度:
while
计算距离最近一次时间事件执行的间隔,用这个时间间隔阻塞等待文件事件,处理文件事件,处理时间事件
对文件事件和时间事件的处理都是同步,有序,原子地执行的。
因为时间事件在文件事件之后执行,并且事件之间不回出现抢占,所以时间事件的实际处理时间,通常会比时间事件设定的到达时间稍晚一些。

浙公网安备 33010602011771号