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()
事件调度规则:
aeApiPoll
函数(也就是等待文件事件产生
那一步)的最大阻塞时间由到达时间最接近当前时间的时间事件决定- 在没到达时间事件之前,会一直处理文件事件
- 对文件事件和时间事件的处理都是同步、有序、原子地执行的,服务器不会中途中断事件处理,也不会对事件进行抢占。
在看一个具体的例子:
开始时间 | 结束时间 | 动作 |
---|---|---|
0 | 10 | 创建一个在100毫秒到达的时间事件 |
11 | 30 | 等待文件事件 |
31 | 50 | 处理文件事件 |
51 | 85 | 等待文件事件 |
85 | 130 | 处理文件事件 |
131 | 150 | 执行 时间事件 |
上表中可以看出:
① 时间事件尚未到达时,服务器是执行文件事件,并处理了两个。
② 因为处理事件的过程不会出现抢占,所以实际处理时间事件的时间比预定的100毫秒慢了30毫秒
标签:时间,Redis,笔记,学习,文件事件,事件,服务器,处理器 来源: https://blog.csdn.net/u013066244/article/details/110753253