基础知识(了解):事件驱动、reactor、I/O多路复用,或者NIO
事件类型:IO事件、时间事件,其中时间事件分为定期事件和周期事件(截止redis2.8,只有周期事件,且只有一个:serverCron事件)
通常redis的时间事件只有一个,serverCron事件:定期对自身的资源和状态进行查检调整,任务
- 更新服务器的各类统计信息,如时间、内存占用、数据库占用情况等
- 清理数据库中过期键值对
- 关闭和清理连接失效的客户端
- 尝试进行AOF或RDB持久化操作
- 主服务器,定期对从服务器进行同步
- 集群模式下,定期对集群进行同步和连接测试
- 2.6,每秒支行10次
- 2.8,hz选项调整每秒执行次数
事件调度:
- redis服务器启动,完成初始化后,进入事件循环
- 获取并计算最近的时间事件,得到获取IO事件时的阻塞时间,负数则置0
- 在上一步计算得出的阻塞时间(可有为零)内,获取所有IO事件,并执行处理函数
- 调用时间事件处理器:获取所有到达的时间事件,执行处理函数
- 结束本次循环,进入下一次
由以上事件调度模型可知,redis的时间事件总是发生在IO事件之后(除非一直没有IO事件发生),而IO事件是随机事件,且执行时间并不精确,因此 时间事件的执行时间也不精确,且通常晚于预计时间;
事件循环伪代码:
public void main(String[] args){
redisServerInit();
while(!stop){
redisEventLoopHandler();
}
}
// 一个事件循环过程
static void redisEventLoopHandler(){
// 获取最新的时间事件,并计算距离当前时间的为毫秒数
long remaind = computeLatestEventTime();
// 如果小于等于0,说明事件执行时间已到达,置为0
if (remaind <= 0){
remaind = 0;
}
// 阻塞获取所有发生的IO事件
IOEvent[] events = aeApiPoll(remaind);
for(IOEvent event : events){
processIOEvents(event);
}
// 处理所有到达的时间事件(截止2.8,其实就一个serverCron事件)
processTimeEvents();
}