第12章 事件

本文深入探讨了Redis服务器如何利用事件驱动模型处理客户端连接及定时任务。通过Reactor模式,Redis能够高效地处理大量并发连接,并确保关键操作按时执行。

Redis服务器是一个事件驱动程序,处理以下两类事件:

  • 文件事件:Redis服务器通过套接字与客户端(或者其他Redis服务器)进行连接,文件事件就是对套接字操作的抽象。
  • 时间时间:Redis服务器中的一些操作需要在给定的时间点执行,而时间事件就是服务器对这类定时操作的抽象。

1.文件事件

Redis基于Reactor模式开发了自己的网络事件处理器:称为文件事件处理器

  • 文件事件处理器使用I/O多路复用程序来同时监听多个套接字,并根据套接字目前执行的任务来为套接字关联不同的事件处理器。
  • 当被监听的套接字准备好执行连接应答、读取、写入、关闭等操作时,与操作相对应的文件事件就会产生,这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件

文件事件处理器以单线程方式运行,但是通过I/O多路复用来监听多个套接字,文件事件处理器既实现了高性能的网络通信模型,由可以很好的与Redis服务器中其他同样以单线程方式运行的模块进行对接。


1.1 文件事件处理器的构成




1.2  I/O多路复用程序的实现


都是通过包装常见的select、epoll、evport和kqueue这些I/O多路复用函数库实现




1.3 事件的类型

I/O多路复用程序可以监听多个套接字的ae.h/AE_READABLE事件和ae.h/WRITABLE事件,与套接字操作之间的对应关系如下:
  • 当套接字变得可读时(客户端对套接字执行write操作,或者执行close操作),或者有新的可应答套接字出现时(客户端对服务器的监听套接字执行connect操作),套接字产生AE_READABLE事件
  • 当套接字变得可写时(客户端对套接字执行read操作),套接字产生AE_WRITABLE事件

如果一个套接字同时产生这两种事件,那么文件事件分派器会优先处理AE_READABLE事件,等到AE_READABLE事件处理完成之后,才处理AE_WRITABLE


1.4 API

ae.c/aeCreateFileEvent 函数接受一个套接字描述符、一个事件类型,以及一个事件处理器作为参数,


ae.c/aeDeleteFileEvent 函数接受一个套接字描述符和一个监听事件类型作为参数,取消监听,取消关联。

ae.c/aeGetFileEvents函数接受一个套接字描述符,返回该套接字正在被监听的时间类型。


ae.c/aeWait 函数接受一个套接字描述符,一个事件类型和一个毫秒数为参数,在给定时间内阻塞并等待套接字的给定类型时间产生,

ae.c/aeApiPoll函数接受一个sys/time.h/struct timeval 结构参数,并在指定时间内,阻塞并等待所有被aeCreateFileEvent函数设置为监听状态的套接字产生文件事件,当至少一个时间产生,或者等待超时后,函数返回。

ae.c/aeProcessEvents 函数是文件事件分派器,先调用aeApiPoll函数来等待时间产生,然后遍历所有已产生的事件,并调用响应的事件处理器来处理这些事件。

ae.c/aeGetApiName函数返回I/O多路复用程序底层所使用的I/O多路复用函数库的名称


1.5 文件事件的处理器

1.连接应答处理器

networking.c/acceptTcpHander

2. 命令请求处理器


networking.c/readQueryFromClient 

3.命令回复处理器


networking.c/sendReplyToClient 





2. 时间事件

  • 定时事件
  • 周期性事件
一个时间事件主要有以下三个属性组成:
  • id
  • when 毫秒精度的UNIX时间戳
  • timeProc 时间时间处理器

2.1 实现

将所有时间事件都放在一个无序链表中(该链表不按when属性的大小排序)


2.2 API

ae.c/aeCreateTimeEvent  函数接受一个毫秒数milliseconds和一个时间事件处理器proc作为参数,将一个新的时间事件添加到服务器

ae.c/aeDeleteFileEvent 函数接受一个时间事件ID作为参数,然后从服务器中删除该ID所对应的时间事件。

ae.c/aeSearchNearestTimer 函数返回到达时间距离当前时间最接近的那个时间事件。

ae.c/processTimeEvents函数是时间事件的执行器


3.事件的调度与执行

ae.c/aeProcessEvents



下载前可以先看下教程 https://pan.quark.cn/s/16a53f4bd595 小天才电话手表刷机教程 — 基础篇 我们将为您简单的介绍小天才电话手表新机型的简单刷机以及玩法,如adb工具的使用,magisk的刷入等等。 我们会确保您看完此教程后能够对Android系统有一个最基本的认识,以及能够成功通过magisk root您的手表,并安装您需要的第三方软件。 ADB Android Debug Bridge,简称,在android developer的adb文档中是这么描述它的: 是一种多功能命令行工具,可让您与设备进行通信。 该命令有助于各种设备操作,例如安装和调试应用程序。 提供对 Unix shell 的访问,您可以使用它在设备上运行各种命令。 它是一个客户端-服务器程序。 这听起来有些难以理解,因为您也没有必要去理解它,如果您对本文中的任何关键名词产生疑惑或兴趣,您都可以在搜索引擎中去搜索它,当然,我们会对其进行简单的解释:是一款在命令行中运行的,用于对Android设备进行调试的工具,并拥有比一般用户以及程序更高的权限,所以,我们可以使用它对Android设备进行最基本的调试操作。 而在小天才电话手表上启用它,您只需要这么做: - 打开拨号盘; - 输入; - 点按打开adb调试选项。 其次是电脑上的Android SDK Platform-Tools的安装,此工具是 Android SDK 的组件。 它包括与 Android 平台交互的工具,主要由和构成,如果您接触过Android开发,必然会使用到它,因为它包含在Android Studio等IDE中,当然,您可以独立下载,在下方选择对应的版本即可: - Download SDK Platform...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值