目录
1.引言
Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件:
1)文件事件(file event):Redis服务器通过套接字与客户端(或者 其他Redis服务器)进行连接,而文件事件就是服务器对套接字操作的抽象。服务器与客户端(或者其他服务器)的通信会产生相应的文件事件,而服务器则通过监听并处理这些事件来完成一系列网络通信操作
2)·时间事件(time event):Redis服务器中的一些操作(比如 serverCron函数)需要在给定的时间点执行,而时间事件就是服务器对 这类定时操作的抽象
2.时间事件的构成和分类
分类:
定时事件:让一段程序在指定的时间之后执行一次。比如说,让 程序X在当前时间的30毫秒之后执行一次。
·周期性事件:让一段程序每隔指定时间就执行一次。比如说,让 程序Y每隔30毫秒就执行一次
相关属性:
id:服务器为时间事件创建的全局唯一ID(标识号)。ID号按从小到大的顺序递增,新事件的ID号比旧事件的ID号要大。
·when:毫秒精度的UNIX时间戳,记录了时间事件的到达 (arrive)时间。
·timeProc:时间事件处理器,一个函数。当时间事件到达时,服务器就会调用相应的处理器来处理事件
区分(一个时间事件是定时事件还是周期性事件取决于时间事件处理器的 返回值):
1.如果事件处理器返回ae.h/AE_NOMORE,那么这个事件为定时事件:该事件在达到一次之后就会被删除,之后不再到达
2.如果事件处理器返回一个非AE_NOMORE的整数值,那么这个事 件为周期性时间:当一个时间事件到达之后,服务器会根据事件处理器 返回的值,对时间事件的when属性进行更新,让这个事件在一段时间之 后再次到达,并以这种方式一直更新并运行下去
3.时间事件的实现
服务器将所有时间事件都放在一个无序链表中,每当时间事件执行 器运行时,它就遍历整个链表,查找所有已到达的时间事件,并调用相 应的事件处理器
图解一:
解析:
上图展示了一个保存时间事件的链表的例子,链表中包含了三个不同的时间事件
1.关于排序: 链表中包含了三个 不同的时间事件:因为新的时间事件总是插入到链表的表头,所以三个 时间事件分别按ID逆序排序,表头事件的ID为3,中间事件的ID为2,表 尾事件的ID为1。
2.note:我们说保存时间事件的链表为无序链表,指的不是链表不按 ID排序,而是说,该链表不按when属性的大小排序。正因为链表没有 按when属性进行排序,所以当时间事件执行器运行的时候,它必须遍历 链表中的所有时间事件,这样才能确保服务器中所有已到达的时间事件 都会被处理。
4.时间事件的应用示例(serverCron)
背景:
持续运行的Redis服务器需要定期对自身的资源和状态进行检查和调整,从而确保服务器可以长期、稳定地运行,这些定期操作由 redis.c/serverCron函数负责执行
功能:
1.更新服务器的各类统计信息,比如时间、内存占用、数据库占用 情况等。
2.清理数据库中的过期键值对。
3.关闭和清理连接失效的客户端。
4.尝试进行AOF或RDB持久化操作
5.如果处于集群模式,对集群进行定期同步和连接测试
Redis 2.6 规定 serverCron 10次/s, 即每 100ms/次。
Redis 2.8 开始,用户可以通过修改 hz 选项来调整 serverCron的每秒执行次数
具体数据结构
redisServer{
//秒级(缓存)
unixtime:
//毫秒级(缓存)
mstime;
/*用来记录当前时间的(缓存)。每10秒更新一次,因此这个值是模糊的。
stat_peak_memory:已使用的内存峰值
可以用info memory查看,这个可以用来作为内存淘汰机制触发的依据。
shutdown_asap:关闭服务器的标识。每次serverCron函数运行时,都会对这个shutdown_asap进行检查,看是否要关闭服务器。
shutdown命令可修改shutdown_asap的状态值*/
lruclock;
clientsCron函数;//用来管理客户端资源。比如检查客户端和服务端的连接是否超时。客户端的输入缓冲区是否耗费过多内存
databasesCron函数;//检查过期建,并删除
rdb_child_pid;//检查持久化操作的运行状态。如下
aof_child_pid;//检查持久化操作的运行状态。如下
...省略,其他细节的可以自行去看redis的源码
}:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/129586.html