Redis中的事件(三)

时间事件

事件的调度与执行

因为服务器中同时存在文件事件和时间事件两种事件类型,所以服务器必须对这两种事件进行调度,决定何时应该处理文件事件,何时有应该处理时间事件,以及花多少事件来处理它们等等。事件的调度和执行由ae.c/aeProcessEvents函数负责,伪代码表示如下:

def aeProcessEvents():# 获取到达时间离当前时间最接近的时间事件time_event = aeSearchNearestTimer()# 计算最接近的时间事件距离到达还有多少毫秒remaind_ms = time_event.when - unix_ts_now()# 如果事件已到达,那么remaind_ms可能为负数,将它设定为0if remaind_ms < 0:remaind_ms = 0# 根据remaind_ms的值,创建timeval结构timeval = create_timeval_with_ms(remaind_ms)# 阻塞并等待文件事件产生,最大阻塞事件由传入的timeval结构决定# 如果remaind_ms的值为0,那么aeApiPoll调用之后马上返回,不阻塞aeApiPoll(timeval)# 处理所有易产生的文件事件processFileEvents()# 处理所有已到达的时间事件processTimeEvents()

将aeProcessEvents函数置于一个循环里面,加上初始化和清理函数,这就构成了Redis服务器的主函数,以下是该函数的伪代码表示:

def main():# 初始化服务器init_server()# 一直处理事件,直到服务器关闭为止while server_is_not_shutdown():aeProcessEvents()# 服务器关闭,执行清理操作clean_server()

从事件处理的角度来看,Redis服务器的运行流程可以用流程图来表示
在这里插入图片描述

事件的调度和执行规则:

  • 1.aeApiPoll函数的最大阻塞事件由到达时间最接近当前时间的时间事件决定,这个方法既可以避免服务器对时间事件进行频繁的轮询(忙等待),也可以确保aeApiPoll函数不会阻塞过长时间
  • 2.因为文件事件是随机出现的,如果等待并处理完一次文件事件之后,仍未有任何时间事件到达,那么服务器将再次等待并处理文件事件。随着文件事件的不断执行,时间会逐渐向时间事件所设置的到达时间逼近,并最终来到到达时间,这时服务器就可以开始处理到达的时间事件了
  • 3.对文件事件和时间事件的处理都是同步的、有序、原子地执行的,服务器不会中途中断事件处理,也不会对事件进行抢占,因此,不管是文件事件的处理器,还是时间事件的处理器,它们都会尽可能地
    减少程序地阻塞时间,并在有需要时主动让出执行权,从而降低造成事件饥饿地可能性。比如说,在命令回复处理器将一个命令回复写入到客户端套接字时,如果写入字节数超过了一个预设常量的话,命令回复
    处理器就会主动用break跳出写入循环,将余下的数据留到下次再写;另外时间事件也会将非常耗时的持久化操作放到子线程或者子进程执行
  • 4.因为时间事件在文件事件之后执行,并且事件之间不会出现抢占,所以时间事件的实际处理事件,通常回避时间事件设定的到达时间晚一些

例子

举个例子,事件执行过程凸显了上面的规则,

  • 1.因为时间事件尚未到达,所以在处理时间事件之前,服务器已经等待并处理了两次文件事件
  • 2.因为处理事件的过程中不会出现抢占,所以实际处理时间事件的时间比预定的100毫秒慢了30毫秒
    在这里插入图片描述

重点

  • 1.Redis服务器是一个事件驱动程序,服务器处理的事件分为时间事件和文件事件两类。
  • 2.文件事件处理器是基于Reactor模式实现的网络通信程序
  • 3.文件事件是对套接字操作的抽象:每次套接字变得可应答(acceptable)、可写(writable)或者可读(readale)时,相应的文件事件就会产生
  • 4.文件事件分为AE_READABLE事件(读事件)和AE_WRITABLE事件(写事件)两类
  • 5.时间事件分为定时事件和周期性事件:定时事件只在指定的事件到达一次,而周期性事件则每隔一段时间到达一次
  • 6.服务器在一般情况下只执行serverCron函数一个时间事件,并且这个事件是周期性事件
  • 7.文件事件和时间事件之间是合作关系,服务器会轮流处理这两种事件,并且处理事件的流程中也不会出现抢占
  • 8.时间事件的实际处理时间通常回避设定的到达时间要晚一些

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/571809.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv9改进策略:卷积魔改 | PConv减少冗余计算和内存访问可以更有效地提取空间特征 |CVPR2023 FasterNet

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a;CVPR2023 提出的一种新的partial convolution&#xff08;PConv&#xff09;&#xff0c;通过同时减少冗余计算和内存访问可以更有效地提取空间特征&#xff0c;最后引入到YOLOv9。在detect前加入PConv&#x…

php反序列化——pop链构造[SWPUCTF 2021 新生赛]pop [NISACTF 2022]babyserialize

构造pop链 [SWPUCTF 2021 新生赛]pop 用反推法 从后往前推 这题的最后一步很明显 只要给$admin和$passwd赋值 就会echo flag 所以反推法第一步就是要调用Getflag()函数 找到$this->w00m->{$this->w22m}(); $this->mw00->{$this->w22m}();的意思是调用当…

Linux课程____shell脚本应用

:一、认识shell 常用解释器 Bash , ksh , csh 登陆后默认使用shell&#xff0c;一般为/bin/bash&#xff0c;不同的指令&#xff0c;运行的环境也不同 二、 编写简单脚本并使用 # vim /frist.sh //编写脚本文件&#xff0c;简单内容 #&#xff01;/bin/bash …

C++ :STL中vector扩容机制

vector是STL提供的动态数组&#xff0c;它会在内部空间不够用时动态的调整自身的大小&#xff0c;调整过程中会有大量的数据拷贝&#xff0c;为了减少数据拷贝的次数vector会在调整空间的时候尽量多申请一些空间&#xff0c;这些预留出的空间可以很大程度上减少拷贝的发生。 在…

WPF —— ContextMenu右键菜单 Canvas控件详解

ContextMenu右键菜单的实例 ​​​​​​​WPF中的右键菜单主要是通过ContextMenu来实现&#xff0c; 在控件中使用ContextMenu 直接在控件的ContextMenu属性中关联即可。 <Label Content"右键弹出内容菜单" FontSize"20" Width"200" Heig…

Redis面试题-缓存穿透,缓存击穿,缓存雪崩

1、穿透: 两边都不存在&#xff08;皇帝的新装&#xff09; &#xff08;黑名单&#xff09; &#xff08;布隆过滤器&#xff09; 解释&#xff1a;请求的数据既不在Redis中也不在数据库中&#xff0c;这时我们创建一个黑名单来存储该数据&#xff0c;下次再有类似的请求进来…

Go第三方框架--gin框架(二)

4. gin框架源码–Engine引擎和压缩前缀树的建立 讲了这么多 到标题4才开始介绍源码&#xff0c;主要原因还是想先在头脑中构建起 一个大体的框架 然后再填肉 这样不容易得脑血栓。标题四主要涉及标题2.3的步骤一 也就是 标题2.3中的 粗线框中的内容 4.1 Engine 引擎的建立 见…

MySQL语句(补充)

目录 一、子查询 1.1.select 语句 1.1.1.相同表查询 1.1.2.多表查询 1.1.3.NOT 1.1.4. insert 1.1.5. update 1.1.6.delete 1.1.7.exists 1.1.8.as别名 二、MySql视图 2.1.视图与表的区别和联系 2.2.建立视图 2.3.修改视图表数据 三、NULL值 四、连接查询 4…

Android Studio详细安装教程及入门测试

Android Studio 是 Android 开发人员必不可少的工具。 它可以帮助开发者快速、高效地开发高质量的 Android 应用。 这里写目录标题 一、Android Studio1.1 Android Studio主要功能1.2 Android应用 二、Android Studio下载三、Android Studio安装四、SDK工具包下载五、新建测试…

以实践助力《银行保险机构数据安全管理办法》规范落地

日前&#xff0c;金融监管总局网站显示&#xff0c;为规范银行业保险业数据处理活动&#xff0c;保障数据安全&#xff0c;促进数据合理开发利用&#xff0c;金融监管总局起草了《银行保险机构数据安全管理办法&#xff08;征求意见稿&#xff09;》&#xff08;下称《办法》&a…

【C语言】strcmp 的使⽤和模拟实现

前言 这篇文章将要带我们去实现模拟一个strcmp函数 首先我们要知道strcmp函数的定义 strcmp()定义和用法 我们先看一下strcmp在cplusplus网站中的定义 链接: link int strcmp ( const char * str1, const char * str2 );比较两个字符串将 C 字符串 str1 与 C 字符串 str2 …

【物联网开源平台】tingsboard安装与编译

别看这篇了&#xff0c;这篇就当我的一个记录&#xff0c;我有空我再写过一篇&#xff0c;编译的时候出现了一个错误&#xff0c;然后我针对那一个错误执行了一个命令&#xff0c;出现了绿色的succes,我就以为整个tingsboard项目编译成功了&#xff0c;后面发现的时候&#xff…