学习笔记-Redis设计与实现-事件
Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件:
文件事件(file event):Redis服务器通过套接字与客户端(或者其他Redis服务器)进行连接,而文件事件就是服务器对套接字操作的抽象。
时间事件(time event):Redis服务器中的一些操作(比如serverCron函数)需要在给定的时间点执行,而时间事件就是服务器对这类定时操作的抽象。
12.1 文件事件
Redis基于Reactor模式开发了自己的网络事件处理器,被称为文件事件处理器(file event handler):
文件事件处理器使用I/O多路复用(multiplexing)程序来同时监听多个套接字,并根据套接字目前执行的任务来为套接字关联不同的事件处理器。
当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close)等操作时,与操作相对应的文件事件就会产生,这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。
虽然文件事件处理器以单线程方式运行,但通过使用I/O多路复用程序来监听多个套接字,文件事件处理器既实现了高性能的网络通信模型,又可以很好地与Redis服务器中其他同样以单线程方式运行地模块进行对接,这保持了Redis内部单线程设计地简单性。
12.1.1 文件事件处理器地构成
文件事件处理器的四个组成部分,分别时套接字、I/O多路复用程序、文件事件分派器(dispatcher),以及事件处理器。
文件事件是对套接字操作的抽象,每当一个套接字准备好执行连接应答(accept)、写入、读取、关闭等操作时,就会产生一个文件事件。因为一个服务器通常会连接多个套接字,所以多个文件事件有可能会并发地出现。
I/O多路复用程序负责监听多个套接字,并向文件事件分派器传送产生了事件地套接字。
尽管多个文件事件可能会并发地出现,但I/O多路复用程序总是会将所有产生事件地套接字都放到一个队列里面,然后通过这个队列,以有序(sequentially)、同步(synchronously)、每次一个套接字的方式向文件事件分派器传送套接字。
文件事件分派器接收I/O多路复用程序传来地套接字,并根据套接字产生地事件地类型,调用响应地事件处理器。
12.1.2I/O多路复用程序的实现
12.1.3 事件的类型
I/O多路复用程序可以监听多个套接字的ae.h/AE_READABLE事件和ae.h/AE_WRITEABLE事件,这两类事件和套接字操作之间的对应关系如下:
当套接字变得可读时(客户端对套接字执行write操作,或者执行close操作),或者有新的可应答(acceptable)套接字出现时(客户端对服务器的监听套接字执行connect操作),套接字产生AE_READABLE事件。
当套接字变得可写时(客户端对套接字执行read操作),套接字产生AE_WRITEABLE事件。
如果一个套接字又可读又可写,那么服务器优先读套接字,后写套接字。
12.1.4 API
12.1.5 文件事件的处理器
1、连接应答处理器
2、命令请求处理器
3、命令回复处理器
12.2 时间事件
Redis的时间事件分为定时事件和周期性事件。
一个时间事件主要由以下三个属性组成:
id:服务器为时间事件创建的全局唯一ID。
when:毫秒精度的UNIX时间戳,记录了时间事件的到达时间。
timeProc:时间事件处理器。
一个时间事件是定时事件还是周期性事件取决于时间事件处理器的返回值:
如果事件处理器返回ae.h/AE_NOMORE,事件为定时事件:该事件在达到一次之后就会被删除。
如果事件处理器返回一个非AE_NOMORE的整数值,那么这个事件为周期性事件。
12.2.1 实现
服务器将所有时间事件都放在一个无序链表中,每当时间事件执行器运行时,它就遍历整个链表,查找所有已到达的时间事件,并调用相应的事件处理器。
12.2.2 API
12.2.3 时间事件应用实例:serverCron函数
持续进行的Redis服务器需要定期对自身的资源和状态进行检查和调整,从而确保服务器可以长期、稳定地运行,这些定期操作由redis.c/serverCron函数负责执行,它的主要工作包括:
更新服务器的各类统计信息,比如时间、内存占用、数据库占用情况等。
清理数据库中的过期键值对。
关闭和清理连接失效的客户端。
尝试进行AOF或RDB持久化操作。
如果服务器是主服务器,那么对从服务器进行定期同步。
如果处于集群模式,对集群进行定期同步和连接测试。
12.3 事件的调度与执行
事件的调度和执行规则:
aeApiPoll函数的最大阻塞时间由到达时间最接近当前时间的时间事件决定,这个方法既可以避免服务器对时间事件进行频繁的轮询,也可以确保aeApiPoll函数不会阻塞过长时间。
因为文件事件是随机出现的,如果等待并处理完一次文件事件之后,仍未有任何时间事件到达,服务器将再次等待并处理文件事件。
对文件事件和时间事件的处理都是同步、有序、原子地执行地,服务器不会中途中断事件处理,也不会进行抢占,因此,不管是文件事件地处理器,还是时间事件地处理器,它们都会尽可能地减少程序地阻塞时间,并在有需要时主动让出执行权,从而降低造成事件饥饿地可能性。
因为时间事件在文件事件之后执行,并且事件之间不会出现抢占,所以时间事件地实际处理时间,通常会比时间事件设定的到达时间稍晚一些。
12.4 重点回顾
Redis服务器时一个事件驱动程序,服务器处理的事件分为时间事件和文件事件两类。
文件事件处理器是基于Reactor模式出现的网络通信程序。
文件事件是对套接字操作的抽象:每次套接字变为可应答(acceptable)、可写(writable)或者可读(readable)时,相应的文件事件就会产生。
文件事件分为AE_READABLE事件和AE_WRITEABLE事件两类。
时间事件分为定时事件和周期性事件。
服务器在一般情况下只执行serverCron函数一个时间函数,并且这个事件是周期性事件。
文本事件和时间事件之间是合作关系,服务器会轮流处理这种事件,并且处理事件的过程中也不会产生抢占。
时间事件的实际处理时间通常会比设定的到达时间晚一些。
![](/img/my/wx.png)
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
vRealize Operations Manager 6.2部署与配置
VMware vRealize Operations Manager可以通过预测分析和智能警示主动识别和解决新出现的问题,从而确保应用程序和基础架构的最佳性能和可用性,能够在一个位置跨应用程序、存储和网络设备进行全面监控。此外,vRealize Operations Manager 还通过预安装并且可自定义的策略简化了关键过程,同时保持完全控制,从而提高了效率。 vRealize Operations Manager 6.2是2016 年 4 月 26 日发行的版本,基本上VMware每3、4个月就会发行新的版本,目前最新的是2016 年11 月 15日发行的支持vSphere 6.5的vRealize Operations Manager 6.4。由于我的环境都还是vSphere 6.0的,之前下载的是vRealize Operations Manager 6.2的OVF,就先拿来测试一下。新的6.3、6.4版主要是对功能、性能、缺陷做了一些改进,安装部署都大同小异,本文使用6.2的版本介绍部署与配置依然具有可参考性。 vRealize Operations Manager 6.2...
- 下一篇
nginx安装第三方模块
nginx文件非常小,但是性能非常的高效,这方面完胜apache,nginx文件小的一个原因之一是nginx自带的功能相对较少,好在nginx允许第三方模块,第三方模块使得nginx越发的强大. 在安装模块方面,nginx显得没有apache安装模块方便,当然也没有php安装扩展方便.在原生的nginx,不可以动态加载模块,所以当你安装第三方模块的时候需要覆盖nginx文件。 接下来看看如何安装nginx第三模块吧: nginx第三方模块安装方法: ./configure --prefix=/你的安装目录 --add-module=/第三方模块目录 下载模块: # cd /usr/local/src # wget https://github.com/cfsego/file-md5/archive/master.zip -O file-md5-master.zip # unzip file-md5-master.zip 安装分为二种情况: 1、从未安装过nginx,编译时指定编译参数和添加第三方模块目录 [root@localhost ~]# cd /usr/local/src/ngi...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- Hadoop3单机部署,实现最简伪集群
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Windows10,CentOS7,CentOS8安装Nodejs环境