Redis学习笔记:事件

环境

window10

前言

《Redis 设计与实现》读书笔记;

事件

Redis服务器是一个事件驱动程序;

主要有两类:

① 文件事件:Redis专门用来处理网络通讯操作的封装;Redis服务器通过套接字与客户端进行连接,而文件事件就是服务器对套接字操作的抽象。

② 时间事件:Redis服务器中的一些操作需要在给定的时间点执行,而时间事件就是服务器对这类定时操作的抽象。

文件事件

文件事件分为AE_READABLE事件(读事件)和AE_WRITABLE事件(写事件)两类。

我们想来看下文件事件一个完整的连接过程:

在这里插入图片描述
大致的流程:

Redis服务器启动后,那么这个服务器的监听套接字的AE_READABLE事件应该正处于监听状态之下,而该事件对应的处理器为连接应答处理器;

① 客户端发起服务器连接,触发连接应答处理器的执行。
② 处理器做出连接应答后,会创建客户端套接字、客户端状态,并将客户端套接字的AE_READABLE事件与命令请求处理器进行关联。
③ 客户端发送命令请求,触发命令请求处理器执行;
④ 执行完毕后,会产生相应的命令回复,触发命令回复处理器

时间事件

分为两种:

① 定时事件:在指定的时间之后执行一次。比如,让程序在当前时间的30毫秒之后执行一次。

② 周期性事件:每隔指定时间就执行一次。

时间事件主要由以下三个属性组成:
在这里插入图片描述
Id:全局唯一标识。ID号从小到大顺序递增。
when:记录了时间事件的到达时间。毫秒精度的时间戳
timeProc: 时间事件处理器,一个函数。当时间事件到达时,服务器就会调用相应的处理器来处理事件。

serverCron函数

这个可以说是时间事件的周期性执行的一个具体应用;

Redis服务器利用该函数对自身的资源和状态进行检查和调整;

主要工作:
① 更新服务器的各类统计消息,比如:时间、内存占用、数据库占用等。
② 清理数据库中的过期键值对。
③ 关闭和清理连接失效的客户端。
④ 尝试进行AOF或RDB持久化操作。
⑤ 如果服务器是主服务器,那么对从服务器进行定期同步。
⑥ 如果处于集群模式,对集群进行定期同步和连接测试。

事件的调度

因为同时存在文件事件和时间事件两种事件类型。那么服务器是如何调度的呢?

在这里插入图片描述
上述流程的伪代码:

def main():
	# 初始化服务器
	init_server()
	# 一直处理事件,直到服务器关闭
	while server_is_not_shutdown():
		aeProcessEvents()

	# 服务器关闭,执行清理操作
	clean_server()

事件调度规则:

  1. aeApiPoll函数(也就是等待文件事件产生那一步)的最大阻塞时间由到达时间最接近当前时间的时间事件决定
  2. 在没到达时间事件之前,会一直处理文件事件
  3. 对文件事件和时间事件的处理都是同步、有序、原子地执行的,服务器不会中途中断事件处理,也不会对事件进行抢占。

在看一个具体的例子:

开始时间结束时间动作
010创建一个在100毫秒到达的时间事件
1130等待文件事件
3150处理文件事件
5185等待文件事件
85130处理文件事件
131150执行 时间事件

上表中可以看出:

① 时间事件尚未到达时,服务器是执行文件事件,并处理了两个。
② 因为处理事件的过程不会出现抢占,所以实际处理时间事件的时间比预定的100毫秒慢了30毫秒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山鬼谣me

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值