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,一经查实,立即删除!

相关文章

Linux SPI框架

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

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

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

从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…

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

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

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

一.子类和父类方法之间的关系 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()…

(解决)从同事那里取来的工程不能编译运行,出现以下错误,求帮助

错误 6 未能从程序集 C:\Program Files (x86)\MSBuild\Microsoft\Silverlight for Phone\v4.0\Microsoft.Phone.Build.Tasks.dll 加载任务“Microsoft.Phone.Build.Tasks.ValidateWMAppManifest”。 Could not load file or assembly Microsoft.Build.Utilities, Version2.0.0…

vmstat、sysbench、/proc/interrupts,性能压测

如何查看系统的上下文切换情况 vmstat 是一个常用的系统性能分析工具,主要用来分析系统的内存使用情况,也常用来分析 CPU 上下文切换和中断的次数。 # 每隔 5 秒输出 1 组数据 vmstat 5procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r …

Linux系统上的程序调优思路概要

目录文件系统Linux内核应用程序架构设计性能监控性能测试CPU内存网络磁盘IO文件系统 Linux内核 应用程序 架构设计 性能监控 性能测试 CPU 内存 网络 磁盘IO

观察者模式Java实现

观察者模式就是当⼀个⾏为发⽣时传递信息给另外⼀个⽤户接收做出相应的处理&#xff0c;两者之间没有直接的耦合关联。 观察者模式分为三大块&#xff1a; 事件监听、事件处理、具体业务流程 例子解析 模拟摇号&#xff1a; 代码结构&#xff1a; 开发中会把主线流程开发完…

JavaScript | 声明数组并在每个循环中使用的代码

Declare an array and we have to print its elements/items using for each loop in JavaScript. 声明一个数组&#xff0c;我们必须使用JavaScript中的每个循环来打印其元素/项目。 Code: 码&#xff1a; <html><head><script>var fruits ["apple&…

拾牙的2021年秋招总结(大概会有帮助?)

目录秋招面试经历秋招面经参考基础部分面经常见问题对秋招一些经验最后收获后续安排秋招面试经历 时间公司岗位面试轮次是否完成2021年7月2日 07:00禾赛嵌入式软件工程师提前批一面pass2021年7月7日 16:00图森未来软件研发工程师-Linux应用提前批一面not pass2021年7月9日华为…

CPU使用率的查看以及性能分析(perf top/record/report)

目录CPU使用率查看CPU使用率&#xff08;top、pidstat解释&#xff09;CPU使用率过高perf topperf record 和 perf reportCPU使用率 Linux通过/proc虚拟文件系统&#xff0c;向用户空间提供了系统内部状态的信息。 /proc/stat提供的就是系统的CPU和任务统计信息。 执行命令cat…

如何从JavaScript数组中获取多个随机唯一元素?

The JavaScript is a very versatile language and it has a function almost everything that you want. JavaScript是一种非常通用的语言&#xff0c;它几乎具有您想要的所有功能。 Here, we will show you how to generate random unique elements from an array in JavaSc…

什么是ACID理论(二阶段、三阶段提交、TCC)

目录二阶段提交协议TCC&#xff08;Try-Confirm-Cancel&#xff09;预留成功预留失败三阶段提交协议总结Some questionsreferenceACID理论时对事务特性的抽象和总结&#xff0c;想要实现ACID需要掌握二阶段提交协议以及TCC 这里是有关协议的论文PDF链接&#xff1a; CONCURRENC…

oracle安装后新建数据库实例及配置

ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法 (2011-01-20 13:50:37) 转载▼标签&#xff1a; it 分类&#xff1a; 技术早上同事用PL/SQL连接虚拟机中的Oracle数据库&#xff0c;发现又报了“ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务…

html5游戏开发--动静结合(二)-用地图块拼成大地图 初探lufylegend

一、前言 本次教程将向大家讲解如何用html5将小地图块拼成大地图&#xff0c;以及如何用现有的高级html5游戏开发库件lufylegend.js开发游戏。 首先让我们来了解了解如何用html5实现动画&#xff0c;毕竟“动静结合”是先有动再有静。看了上一章的内容&#xff0c;或许你就有了…

BASE理论(基本可用策略+ 最终一致性实现)

目录实现基本可用的几个策略1、流量削峰&#xff08;不同地区售票时间错峰出售&#xff09;2、延迟响应&#xff0c;异步处理&#xff08;买票排队&#xff0c;基于队列先收到用户买票请求&#xff0c;排队异步处理&#xff0c;延迟响应&#xff09;3、体验降级&#xff08;看到…

Paxos算法(Basic Paxos 与 Multi-Paxos思想)

目录Basic Paxos三个角色达成共识的方法对于Basic Paxos的总结Multi-Paxos领导者优化 Basic Paxos 执行referencePaxos 算法包含 2 个部分&#xff1a; 1、Basic Paxos &#xff1a; 描述多节点之间如何就某个值达成共识 2、Multi-Paxos &#xff1a; 描述执行多个Basic Paxos实…

vs2012下调试mvc4源代码

当前流行的应该是mvc3才对。然后在研究mvc3的源代码时候&#xff0c;Html这个属性下的扩展方法Partial()都没有。IntelliSense不会提示该方法&#xff0c;找了半天的资料也问了一些博友&#xff0c;没看到好的解决棒法。最后没辙另辟蹊跷&#xff0c;就开始着手研究mvc4的源代码…