Redis 事件模型

基础知识(了解):事件驱动、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();
}

转载于:https://my.oschina.net/u/2407208/blog/3010157

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值