redis——事件

redis服务器是一个事件驱动程序。

需要处理两类事件:

1)文件事件:redis是通过套接字与客户端或者其他服务器连接的,而文件事件就是服务器对套接字操作的抽象。

2)时间事件:服务器对一些定时操作的抽象。

文件事件

redis基于reactor模式开发了自己的网络事件处理器,这个处理器被称作文件事件处理器,它使用IO多路复用程序来同时监听多个套接字, 并根据套接字目前执行的任务来为套接字关联不同的事件处理器,当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close)等操作时, 与操作相对应的文件事件就会产生, 这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。

虽然文件事件处理器以单线程方式运行, 但通过使用 I/O 多路复用程序来监听多个套接字, 文件事件处理器既实现了高性能的网络通信模型, 又可以很好地与 Redis 服务器中其他同样以单线程方式运行的模块进行对接, 这保持了 Redis 内部单线程设计的简单性。

文件事件处理器的构成:

I/O 多路复用程序负责监听多个套接字, 并向文件事件分派器传送那些产生了事件的套接字。

 I/O 多路复用程序会把所有产生事件的套接字放到一个队列, 以有序(sequentially)、同步(synchronously)、每次一个套接字的方式,向文件事件分派器传送套接字。

I/O 多路复用程序可以监听多个套接字的 ae.h/AE_READABLE 事件和 ae.h/AE_WRITABLE 事件

1)当套接字变得可读时(客户端对套接字执行 write 操作,或者执行 close 操作), 或者有新的可应答(acceptable)套接字出现时(客户端对服务器的监听套接字执行 connect 操作), 套接字产生 AE_READABLE 事件。

2)当套接字变得可写时(客户端对套接字执行 read 操作), 套接字产生 AE_WRITABLE 事件。

如果一个套接字又可读又可写的话, 那么服务器将先读套接字, 后写套接字。

下面介绍各种处理器:

1)连接应答处理器:服务器进行初始化时, 程序会将连接应答处理器和服务器监听套接字的 AE_READABLE 事件关联, 当有客户端连接(connect)服务器监听套接字的时候, 套接字就会产生 AE_READABLE 事件, 引发连接应答处理器执行, 并执行相应的套接字应答操作。

2)命令请求处理器:客户端连接到服务器后, 服务器会将客户端套接字的 AE_READABLE 事件和命令请求处理器关联起来, 当客户端发送命令请求时, 套接字就会产生 AE_READABLE 事件, 引发命令请求处理器执行, 并执行相应的套接字读入操作

3)命令回复处理器:服务器有命令回复需要传送给客户端, 服务器会将客户端套接字的 AE_WRITABLE 事件和命令回复处理器关联起来, 当客户端准备好接收服务器传回的命令回复时, 就会产生 AE_WRITABLE 事件, 引发命令回复处理器执行, 并执行相应的套接字写入操作。

一次完整的连接事件实例:

时间事件

redis时间事件可以分为两类:定时事件、周期性事件,他们的特点就像他们的名字一样。

而一个时间事件主要有三部分:

id:服务器为时间事件创建的全局唯一id,按时间递增,越新的越大

when:unix时间戳,记录到达时间

timeProc:时间事件处理器,是一个函数,时间事件到达时,服务器就会调用处理器来处理事件。

目前版本的redis只使用周期性事件

来看看实现:

服务器把所有时间事件放在一个链表中,每当时间事件执行器执行时,它就遍历链表,调用相应的事件处理器。

但是注意:链表是无序的,不按when属性来排序,当时间事件执行器运行时,必须遍历整个链表。但是,无序链表并不影响时间事件处理器的性能,因为在目前版本中,redis服务器只使用serverCron一个时间事件,就算在benchmark模式下也只有两个事件,服务器几乎是把链表退化成指针使用了。

 

事件的调度和执行

 

文件事件和时间事件之间是合作关系, 服务器会轮流处理这两种事件,对两种事件的处理都是同步、有序、原子地进行的,处理事件的过程中也不会进行抢占,所以时间事件的实际处理时间通常会比设定的到达时间晚一些

大概流程为:

是否关闭服务器?---->等待文件事件产生---->处理已经产生的文件事件---->处理已经达到的时间事件---->是否关闭服务器?........

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

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

相关文章

自然语言处理(1)-概述

自然语言处理-概述概述1.基本概念2.人类语言技术HLT发展简史3.HLT 研究内容4.基本问题和主要困难5.基本研究方法概述 本系列文章计划总结整理中国科学院大学宗成庆老师《自然语言处理》课程相关知识,参考数目《统计自然语言处理》-第二版,宗成庆。 1.基…

redis——客户端

redis服务器是典型的一对多服务器,通过使用由IO多路复用技术实现的文件事件处理器,redis服务器使用了单线程单进程的方式来处理请求。 客户端的属性 描述符 客户端状态的 fd 属性记录了客户端正在使用的套接字描述符: typedef struct red…

矩阵论-线性空间的基与坐标,基变换坐标变换

线性空间与线性变换综述1.1 线性空间1.1.3 线性空间的基与坐标1.1.4 基变换与坐标变换综述 本系列博文主要总结学习矩阵论的心得笔记,参考数目《矩阵论》–张凯院;整个文章的整理体系参照行书过程。 1.1 线性空间 1.1.3 线性空间的基与坐标 向量的坐…

大数据学习(2-1)-Hadoop安装教程-单机模式和伪分布模式(Ubuntu14.04LTS)

文章目录目录1.linxu的安装1.1安装Linux虚拟机1.2安装Linux和Windows双系统2.Hadoop的安装2.1 Hadoop安装前配置2.1.1 配置Hadoop用户2.1.2 安装 ssh , 配置ssh免密登录2.1.3 安装java环境2.2 Hadoop的安装3.Hadoop单机版配置4.Hadoop伪分布版配置目录 1.linxu的安装 1.1安装…

mysql——JDBC

概述 JDBC:java Data Base Connectivity ,java数据库连接,它是一种用于执行sql语句的java API,为多种关系数据库提供统一访问。 其实就是一组用java编写的类和接口。 JDBC API 提供两类主要接口: 1)面向开发人员的…

数组精选题目三连(6)

题目一:调整有序的arr数组,使得左半部分有序且不重复,不用保证右边是否有序。 思路: u : 左边的最后位置,即0---u为答案 i : 从u到右遍历 当arr[i]和arr[u]不相等时&#…

大数据学习(2-2)- 使用docker安装配置Hadoop环境

我的思路是这样:安装ubuntu系统---->下载docker---->在docker里拉取hadoop镜像---->在此镜像里创建三个容器(Master、Slave1、Slave2)---->完成完全分布式 1. 安装ubuntu系统(无论你是安装的单系统,还是用虚拟机安装了ubuntu) 如果想安装单…

自然语言处理(2)-信息论基础

自然语言处理-数学基础概述1.信息论基础1.1熵1.2 联合熵和条件熵1.3 相对熵和交叉熵1.4 互信息和双字耦合度1.5 噪声信道模型概述 本系列文章计划总结整理中国科学院大学宗成庆老师《自然语言处理》课程相关知识,参考数目《统计自然语言处理》-第二版,宗…

servlet基础总结

什么是servlet Servlet(Server Applet)是Java Servlet的简称,是小服务程序或服务连接器,是用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容. 狭义的Servlet是指Java语言实…

大数据学习(3)- 分布式文件系统HDFS

文章目录目录1.分布式文件系统1.1 计算机集群概念1.2 分布式文件系统结构2.HDFS简介2.1 HDFS设计的目标2.2HDFS的局限性2.3 块的概念2.4 HDFS主要组件及其功能2.4.1 名称节点2.4.2 第二名称节点2.4.3 数据节点3.HDFS体系结构3.1 HDFS体系结构介绍3.2 HDFS体系结构的局限性4.HDF…

Python 图片转简单字符画

字符画是一系列字符的组合,我们可以把字符看作是比较大块的像素,一个字符能表现一种颜色(暂且这么理解吧),字符的种类越多,可以表现的颜色也越多,图片也会更有层次感。 灰度值:指黑…

大数据学习(4)--分布式数据库HBase

文章目录目录1.HBase概述1.1BigTable1.2 HBase简介1.3 HBase和传统的关系型数据库之间的区别2.HBase访问接口3.HBase数据模型3.1 数据模型概述3.2 数据模型相关概念3.3 数据坐标3.4 概念视图3.5 物理视图3.6 面向列的存储4.HBase的实现原理4.1 HBase功能组件4.2 表和region4.3 …

servlet中的数据存储

在servlet基础中,我们: 用以下几种方式实现数据存储和共享: 1)在客户端页面和服务器端程序之间,用request中的getParameter()方法共享数据 2)在请求和请求之间,可以用get/setAttribute方法来共…

Linux(2)-tar,find,grep,xargs

常用命令1. 打包压缩/解包解压缩 tar1.1 打包 tar -czvf xxx.tar.gz xxx1.2 解压 tar -xzvf xxx.tar.gz2.文件/目录搜索2.1 find文件/目录查找2.2 grep文本匹配3. 复合命令3.1 > 重定向3.2 | 管道.shutdown1. 打包压缩/解包解压缩 tar tar和gzip是对黄金搭档:ta…

Event Recommendation Engine Challenge(基础版)---代码

第一步:统计user和event相关信息 #查看train_csv的数据 import pandas as pd df_train pd.read_csv(train.csv) df_train.head()usereventinvitedtimestampinterestednot_interested03044012191877122502012-10-02 15:53:05.75400000:000013044012150228424802012…

servlet——三兄弟的另外两个:过滤器/监听器

过滤器 我们写多了servlet会发现,很多代码和功能是重复的,比如:解决中文乱码问题、权限验证、日志的记录等,他们的特点是:代码相同或相似、分散在不同位置、不利于维护。 过滤器就是他们的解决办法。 过滤器是请求到…

矩阵论-线性变换的特征值与特征变换

线性空间与线性变换综述1.2 线性变换及其矩阵1.2.3 特征值与特征向量综述 本系列博文主要总结学习矩阵论的心得笔记,参考数目《矩阵论》–张凯院;整个文章的整理体系参照行书过程。 1.2 线性变换及其矩阵 1.2.3 特征值与特征向量 本节讨论如何选择线…