图解redis的时间事件

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 图解redis的时间事件,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

目录

1.引言

2.时间事件的构成和分类

3.时间事件的实现

4.时间事件的应用示例(serverCron)


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.时间事件的实现

服务器将所有时间事件都放在一个无序链表中,每当时间事件执行 器运行时,它就遍历整个链表,查找所有已到达的时间事件,并调用相 应的事件处理器

图解一:

图解redis的时间事件

解析:

上图展示了一个保存时间事件的链表的例子,链表中包含了三个不同的时间事件

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

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!