Redis 事件模型

基础知识(了解):事件驱动、reactor、I/O多路复用,或者NIOjava

事件类型:IO事件、时间事件,其中时间事件分为按期事件和周期事件(截止redis2.8,只有周期事件,且只有一个:serverCron事件)react

一般redis的时间事件只有一个,serverCron事件:按期对自身的资源和状态进行查检调整,任务redis

  • 更新服务器的各种统计信息,如时间、内存占用、数据库占用状况等
  • 清理数据库中过时键值对
  • 关闭和清理链接失效的客户端
  • 尝试进行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();
}
相关文章
相关标签/搜索