文件事件 时间事件

redis是一个事件驱动程序

主要包含

文件事件和时间事件

文件事件:主要就是server和client进行操作产生的文件

时间事件:主要就是一些需要定时执行的事件。

文件事件:

文件事件处理器是单线程运行的,但是通过IO多路复用,可以处理多个套接字

下面是文件事件处理器的结构

文件事件处理器主要是上面四个部分构成的

文件事件其实就是对套接字操作的抽象,我们当执行读写的时候就会产生,因为文件事件处理器可以连接多个套接字,所以可能多个文件事件同时发生,但是IO多路程序会将这些文件事件都放在一个队列里面,通过文件事件分派器分配不同的处理器,每次只能分配一个,必须等上一个处理结束了才会继续处理下一个

IO多路复用的所有功能都是sselct,epoll这些库封装形成的,至于调用哪一个,完全看具体情况使用哪一个的效率

事件处理器的io多路复用可以监听多个socket的读写时间,当发生读事件的时候,产生AE_READABLE,当产生写事件的时候,发生AE_WRITABLE事件。,如果多个套接字同时产生读写时间,我们会先执行读事件,在执行写事件

文件的事件处理器:

连接应答处理器

命令请求处理器:

命令回复处理器

当client连接server的时候,会触发socket的readable执行连接应答处理器。当客户端通过连接应答处理器成功连接到server的时候,我们会将AE_READABLE和命令请求处理器关联起来,当客户端向服务器发送请求命令的时候,套接字就会产生AE_READABLE事件,并发送给命令请求处理器,结束后,当server需要回复client的时候,就会将socket和AE_WRITEABLE事件关联起来。当客户端需要read的时候就会触发这个事件。发送结束会,就会将socket和AE_WRITEABEL解除关联

一次完整的客户端与服务器连接事件示例

让我们来追踪一次 Redis 客户端与服务器进行连接并发送命令的整个过程, 看看在过程中会产生什么事件, 而这些事件又是如何被处理的。

假设一个 Redis 服务器正在运作, 那么这个服务器的监听套接字的 AE_READABLE 事件应该正处于监听状态之下, 而该事件所对应的处理器为连接应答处理器。

如果这时有一个 Redis 客户端向服务器发起连接, 那么监听套接字将产生 AE_READABLE 事件, 触发连接应答处理器执行: 处理器会对客户端的连接请求进行应答, 然后创建客户端套接字, 以及客户端状态, 并将客户端套接字的 AE_READABLE 事件与命令请求处理器进行关联, 使得客户端可以向主服务器发送命令请求。

之后, 假设客户端向主服务器发送一个命令请求, 那么客户端套接字将产生 AE_READABLE 事件, 引发命令请求处理器执行, 处理器读取客户端的命令内容, 然后传给相关程序去执行。

执行命令将产生相应的命令回复, 为了将这些命令回复传送回客户端, 服务器会将客户端套接字的 AE_WRITABLE 事件与命令回复处理器进行关联: 当客户端尝试读取命令回复的时候, 客户端套接字将产生 AE_WRITABLE 事件, 触发命令回复处理器执行, 当命令回复处理器将命令回复全部写入到套接字之后, 服务器就会解除客户端套接字的 AE_WRITABLE 事件与命令回复处理器之间的关联。

时间事件:

时间事件包括定时事件和周期性事件

定时事件就是执行一次

周期性事件都按照周期执行的

时间事件的属性有下面3个

id递增的

when:unix时间戳,表示什么时候执行

timeproc:时间事件处理器,一个函数,

实现其实就是一个链表

服务器会定期处理时间事件:

首先会遍历1所有的时间事件,看看哪个到了时间,如果时间到了的话。会判断返回值是否为AE_NOMORE,如果是的话,从server删除,不是的话,会设置返回值的时间后继续触发执行

时间事件函数:servercron函数

server会定期执行这个函数,这个函数有很多工作,比如对server资源的统计,比如内存,cpu等等

清理过期键

关闭和清理失效的客户端请求

尝试进行AOF和RBD

主从的同步

集群的定期连接测试

因为有两种事件,所以调度就是一个问题,我们需要怎么合理安排事件的调度

我们在选择的时候,经常会选择距离到达时间最近的时间事件,计算时间差,如果没有文件事件到达,可能会阻塞,等待文件事件的到来,文件事件到了之后,会先处理文件事件,等文件事件处理完了之后,在处理时间事件,所以通常时间事件的处理时间有的时候会被到来的晚一些

时间: 2024-10-12 14:23:52

文件事件 时间事件的相关文章

简短小模式 —— 时间事件发生器模式

需求 大部分程序会有一些需要周期执行的事情,也有一些需要在程序启动后执行一次的事情.很明显这类事情和时间有关,因为它们都需要在特定时间发生.这类需要执行的逻辑可以由时间事件发生器触发. 时间事件发生器 时间事件发生器是挂载在虚拟根VirtualRoot上的一个组件,它负责在特定的时间将特定类型的事件发布到系统总线上去.时间事件发生器会发布的事件有: 代码位置 HasBoot1SecondEventHasBoot2SecondEventHasBoot5SecondEventHasBoot10Sec

libev中timer时间事件监控器

1.数据结构 #define ev_at(w) ((WT)(w))->at#define ev_active(w) ((W)(w))->active typedef ev_watcher_time *WT; struct ev_loop{ ev_tstamp mn_now ANHE * timers int timermax int timercnt ev_watcher * rfeeds} /* Heap Entry */     //是否缓存时间监控器中的at字段.#if EV_HEAP_

PA30时间事件获取+删除操作

*&---------------------------------------------------------------------* *& Report  ZHR16012 *&                  huangjm 2016.12.19 *&---------------------------------------------------------------------* *& *& *&--------------

jquery table新增一行,并且绑定时间事件(My97)

废话不多说,先上code 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 5 <title></title> 6 <meta charset="utf-8" /> 7 <link href=&

触摸屏幕时间长短时间、禁止页面点击事件

/*触摸屏幕时间事件(需要先引入JQ插件)*/ $.fn.extend({ mctap:function(func){ var _this=this; this.on('touchstart',function(e){ tiptimer=new Date(); }).on('touchend',function(e){ if(new Date()-tiptimer>300) {func.bind(this,e)();} }) } }); /*禁止页面点击*/ $("#xxx").

小玩意:根据网络时间反馈不同事件

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>时间事件</title></head><body> </body><script> var int_time=new Date();//使用Date获取网络时间; function title(){ var sys

事件时间(event time)与水印(watermark)

事件时间和水印诞生的背景 在实际的流式计算中数据到来的顺序对计算结果的正确性有至关重要的影响 比如:某数据源中的某些数据由于某种原因(如:网络原因,外部存储自身原因)会有2秒的延时,也就是在实际时间的第1秒产生的数据有可能在第3秒中产生的数据之后到来. 假设在一个5秒的滚动窗口中,有一个EventTime是 9秒的数据,在第11秒时候到来了. 图示: 那么对于一个Count聚合的Tumble(5s)的window,上面的情况如何处理才能window3=3,window2=3 呢? 时间类型 Fl

Reactor事件模型在Redis中的应用

1 模型简介 Redis没有使用第三方的libevent等网络库,而是自己开发了一个单线程的Reactor模型的事件处理模型.而Memcached内部使用的libevent库,多线程模型. 综合对比可见:nginx,memcached,redis网络模型总结 Redis在主循环中统一处理文件事件和时间事件,信号事件则由专门的handler来处理. 文件事件,我理解为IO事件,Redis将产生事件套接字放入一个就绪队列中,即redisServer.aeEventLoop.fired数组,然后在ae

Redis源码-事件库

网上看了很多Redis事件库的解读,自己也研究了好几遍,还是记录下来,虽然水平有限,但是进步总会是有的 网络事件库封装了Epoll的操作(当然是指Linux下的多路复用了),并且实现一个定时器,定时器也是服务端程序的基石,很多问题都需要靠定时器解决 (一)数据结构+算法构成一个完整的程序,要一窥Redis网络库,需要先从数据结构开始学习 1.整个事件循环是用一个全局的数据结构描述的,aeEventLoop /* State of an event based program */ typedef