Redis的文件事件与时间事件处理

目录

  • 文件事件处理
    • 事件类型
    • 客户端和服务端的通信过程
  • 时间事件处理
    • 执行器执行
    • 周期性事件作用
  • 事件的调度与执行

文件事件处理

Redis基于Reactor模式开发了文件事件处理器。文件事件处理器以单线程方式运行,通过IO多路复用程序监听多个套接字,实现了高性能网络通信模型,又可以很好的与Redis服务器中同样以单线程运行的模块进行对接,保证了设计的简单性。
文件事件处理器的构成:套接字、I/O多路复用程序、文件事件分派器、事件处理器请添加图片描述

每当一个套接字准备好执行连接应答、写入、读取、关闭操作时就会产生一个文件事件。一个服务器通常会连接多个套接字,所以多个文件事件有可能并发出现。
I/O多路复用程序负责监听多个套接字,并向文件事件分派器传送产生了事件的套接字。
I/O复用程序总是将所有产生事件的套接字放在一个队列里,通过这个队列以有序、同步、每次一个套接字的方式向文件事件分派器传送套接字。

事件类型

  • 当套接字可读(客户端对套接字执行write操作,或者执行close操作),或者有新的可应答套接字出现(客户端对服务器的监听套接字执行connect操作),套接字产生AE_READABLE事件
  • 当套接字可写(客户端对套接字执行read操作),套接字产生AE_WRITABLE
    如果一个套接字同时产生了这两种事件,那么事件分派器会优先处理读套接字,后处理写套接字。

客户端和服务端的通信过程

在这里插入图片描述

时间事件处理

一个时间事件主要由三个属性组成:
1、id:全局唯一id,新事件的id比老事件的id大
2、when:记录时间事件的到达时间(ms级别)
3、timeProc:时间时间处理器,表示事件到达,服务器会调用相应的函数
时间事件分为定时事件与周期性事件,区别在于定时事件在到达一次之后就会被删除,之后不再到达。而周期性事件在到达一次之后会对when属性更新值,表示在一段时间后再次到达。
Redis的实现原理是将所有的时间事件放在一个无序链表中,每当时间事件执行器运作,遍历链表,查找所有已达到时间时间,并调用相应的事件处理器。新的时间时间总是插入链表头部,所以往往是按照ID逆序排列的,这里无序表示不按照when属性大小排序。
由于时间事件个数较少,所以无序链表并不影响时间事件处理器的性能。

执行器执行

执行器具体执行步骤如下:

遍历服务器中的所有时间事件
for (time_event : list)
{检查该事件是否已经到达if (time_event <= now_time) {已到达,执行事件处理器,获取返回值retval = time_event.timeProc()如果是一个定时事件,将事件从服务器中删除if (retval == AE_NOMORE) delete_time_event(time_event)else否则更新when,让该事件在指定时间后再次到达update_when(time_event, retval )}
}

周期性事件作用

Redis服务器需要定期对自身的资源和状态进行检查和调整,此时就会用到serverCron函数,该函数就是以周期性事件触发的。默认是每秒运行10次。
主要作用为:
1、更新服务器各类统计信息,如时间、内存占用、数据库占用情况
2、清理数据库中过期键值对
3、关闭和清理连接失效的客户端
4、尝试进行AOF或RDB持久化操作
5、如果是主服务器还需要对从服务器定期同步
6、如果处于集群模式,还需要对集群定期同步和连接测试

事件的调度与执行

文件事件与时间事件之间是合作关系,服务器会轮流处理两种事件,并且处理的过程中也不会进行在·抢占,所以时间时间的实际处理时间通常回避设定到达时间晚一些。
事件处理角度下的服务器运行流程:
在这里插入图片描述
需要注意的点:
1、为了避免服务器对时间时间进行频繁轮询(忙等待),也为了避免阻塞过长时间,每次最大阻塞时间由到达时间最接近当前时间的时间事件决定。
2、文件事件是随机出现的,所以等处理完一个文件事件之后如果还没有时间事件到达,则服务器再次等待并处理文件事件,随着文件事件不断执行,逐渐接近时间事件设置的到达时间。
3、由于文件处理时同步、有序、原子执行,所以服务器不会中断事件处理,也不会对事件进行抢占。所以不管是那种事件的处理都需要尽可能减少程序阻塞时间。将耗时的操作放到子线程或者子进程中处理

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

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

相关文章

fisher-yates_使用Fisher-Yates随机播放算法以O(n)时间随机播放给定数组

fisher-yatesExample: 例&#xff1a; Say the input array is [1, 2 3, 4, 5 6, 7]After reshuffling it can be anything like[4, 3, 7, 2, 1, 5, 1]Our goal is that the reshuffling should be as random as possible. 我们的目标是&#xff0c;改组应尽可能地随机。 The…

[分享]一些在 WPF/Silverlight 中应用 MVVM 模式时可能会有点用途的代码

想来这个博客也已经有很久没更新过了&#xff0c;新年新气象&#xff0c;现在就开始写新内容吧。 最初的起因 在最近的几个月中我做的开发总是要跟 XAML 打交道&#xff0c;也就是 WPF 啊&#xff0c;Silverlight 啊&#xff0c;WF 啊这些。 在进行 WPF 和 Silverlight 开发的…

手机调用系统的拍照和裁剪功能,假设界面有输入框EditText,在一些手机会出现点击EditText会弹出输入法,却不能输入的情况。...

1、拍照裁剪后 点击EditText会弹出输入法&#xff0c;却不能输入。可是点击点一EdtiText就能够输入了&#xff0c;所以我就写了一个看不见的EdtiText&#xff0c;切换焦点&#xff0c;这样就攻克了这个奇怪的这问题&#xff0c;应该是android内部的问题。 这是网络一个牛人留下…

Redis一个命令请求从发送到完成的步骤以及初始化服务器步骤

一个命令请求从发送到完成的步骤 如下&#xff1a; 1、客户端将命令请求发送给服务器 当用户在客户端中键入一个命令请求时&#xff0c;客户端会将这个命令请求转换成协议格式&#xff0c;然后通过连接到服务器的套接字&#xff0c;将协议格式的命令请求发送给服务器。 2、服…

c打印行号和函数_使用C中的函数名称,行号从任何函数打印错误消息

c打印行号和函数Sometimes, it is necessary to print some message on logic failure or anytime with the function name and line number, so that program can be debugged and fixed the issue. 有时&#xff0c;有必要在逻辑故障时或在任何时候使用功能名称和行​​号打印…

Linux SPI框架

水平有限&#xff0c;描述不当之处还请指出&#xff0c;转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7733476 Linux的SPI子系统采用主机驱动和外设驱动分离的思想&#xff0c;首先主机SPI控制器是一种平台设备&#xff0c;因此它以platform的方式注册进内…

dbms标识符无效_DBMS中的嵌套查询,相关的嵌套查询和集合比较运算符

dbms标识符无效嵌套查询 (Nested Queries) A query embedded in a query. This type of relation is termed as Nested Query and the Embedded Query is termed as a subquery. 查询中嵌入的查询。 这种类型的关系称为嵌套查询&#xff0c;而嵌入式查询称为子查询。 For exam…

重构——解决过长参数列表(long parameter list)

目录1、Replace Param with Query2、Preserve Whole Object3、Introduce Param Object4、Remove Flag Argument5、Combine Functions into ClassReference当我们需要在超长函数中提炼子函数时&#xff0c;如果函数内有大量的参数和临时变量&#xff0c;这将会对函数的提炼形成很…

C# 点点滴滴: out和ref

用c#很长一段时间了&#xff0c;不过基本是啥都不会&#xff0c;当C用的&#xff0c;作为写单片机的&#xff0c;还是真心觉得C比较亲切&#xff0c;呵呵。 不过总是要进步啊&#xff0c;慢慢积累呗&#xff0c;这次是写一个CAN的上位机模板出来&#xff0c;以后的项目就要彻底…

css控制图片最宽 最高值

.content img{width:expression_r(this.width > 500 && this.height < this.width ? 500:true);max-width:500px;height:expression_r(this.height >500 ? 500:true);max-height:500px; }转载于:https://www.cnblogs.com/panlin/archive/2013/01/06/2848017…

踩踩踩

http://china.findlaw.cn/laodongfa/ctjg/cy/cybc/ 二、合法裁员经济补偿标准的计算 按照《劳动合同法》第四十七条规定&#xff0c;经济补偿按劳动者在本单位工作的年限&#xff0c;每满一年支付一个月工资的标准向劳动者支付。六个月以上不满一年的&#xff0c;按一年计算;不…

c# 字节十六进制转十进制_用C中的十进制,八进制和十六进制数字初始化字节数组...

c# 字节十六进制转十进制C中的字节数组 (byte array in C) In C programming language, an unsigned char type can be used to declare byte array in C programming language. An unsigned char can contain a value from 0 to 255, which is the value of a byte. 在C编程语…

从uptime、stress、mpstat、pidstat观察CPU密集型、IO密集型、进程密集型切换的系统性能

uptime dyydyy-Lenovo-ThinkBook-14-IIL:~$ uptime10:27:10 up 7 min, 1 user, load average: 1.32, 0.99, 0.49结果分别对应&#xff1a;当前时间、系统运行时间、当前用户数目、过去 1 分钟、5 分钟、15 分钟的平均负载(Load Average) 平均负载是指单位时间内&#xff0c…

解析和创建xml

http://www.cnblogs.com/Li-Cheng/p/3610474.html 转载于:https://www.cnblogs.com/mxw272618/p/3769900.html

python - VirtualEnv virtualenvwrapper

VirtualEnv 是什么 VirtualEnv用于在一台机器上创建多个独立的python运行环境&#xff0c;VirtualEnvWrapper为前者提供了一些便利的命令行上的封装。 为什么要用 - 隔离项目之间的第三方包依赖&#xff0c;如A项目依赖django1.2.5&#xff0c;B项目依赖django1.3。- 为部署应用…

多台计算机共享内存_共享内存多处理器和指令执行| 计算机架构

多台计算机共享内存共享内存多处理器 (Shared Memory Multiprocessor) There are three types of shared memory multiprocessor: 共有三种类型的共享内存多处理器&#xff1a; UMA (Uniform Memory Access) UMA(统一内存访问) NUMA (Non- uniform Memory Access) NUMA(非统一…

htop与atop

htop htop使用详解–史上最强 atop Linux atop监控工具部署

js未看的文章

Web前端研发工程师编程能力飞升之路 在浏览器的背后&#xff08;一&#xff09; —— HTML语言的词法解析 组件化的前端开发流程 用js书写UI组件之js基础知识 GC与JS内存泄漏 蓝色理想之前端开发 w3c JavaScript Puzzlers react AngularJS入门教程 jQuery源码分析-如何做jQuery…

方法重写,隐藏在子类父类中的各种调用实践

一.子类和父类方法之间的关系 1.当子类和父类有方法完全相同的方法 namespace ConsoleApplication2 {class Program{static void Main(string[] args){B b new B();A a new A();A c new B();b.Show();a.Show();c.Show();Console.Read();}}public class A{public void Show()…

向量余弦值python_向量/矩阵的余弦值打印(元素明智的操作) 使用Python的线性代数

向量余弦值pythonPrerequisite: 先决条件&#xff1a; Defining a Vector 定义向量 Defining a Matrix 定义矩阵 Numpy is the library of function that helps to construct or manipulate matrices and vectors. The function numpy.cos(x) is a function used for generati…