事件的关系及运算教学设计

事件的关系及运算教学设计,第1张

学习笔记-Redis设计与实现-事件

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

  • 文件事件):Redis服务器通过socket与客户端(或其他Redis服务器)连接,文件事件是服务器对socket *** 作的抽象。

  • Timeevent:Redis服务器中的一些 *** 作(如serverCron函数)需要在给定的时间点执行,而timeevent):Redis是服务器对这类定时 *** 作的抽象。


    12.1文件事件

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

  • 文件处理程序使用I/O多路复用程序同时监听多个套接字,并根据套接字当前执行的任务为套接字关联不同的事件处理程序。

  • 当被监控的套接字准备好执行连接应答(接受)、读(读取)、写(关闭)等 *** 作时。,会生成 *** 作对应的文件事件,然后文件事件处理程序会调用socket之前关联的事件处理程序来处理这些事件。

    虽然文件事件处理程序运行在单线程模式下,但是通过使用I/O复用器来监控多个套接字,文件事件处理程序不仅实现了高性能的网络通信模型,而且可以很好地与Redis服务器中同样运行在单线程模式下的其他模块接口,保持了Redis单线程设计的简单性。

    12.1.1文件事件处理器地构成

    文件事件处理程序的四个组件是套接字、I/O多路复用器、文件事件调度器和事件处理程序。


    文件事件是套接字 *** 作的抽象。每当套接字准备好执行诸如连接接受、写入、读取、关闭等 *** 作时。,将生成一个文件事件。因为服务器通常连接多个套接字,所以多个文件事件可能同时发生。

    I/Omultiplexer负责监听多个套接字,并将生成事件的套接字传输到文件事件调度程序。

    尽管多个文件事件可能同时发生,但I/O多路复用器总是将生成事件的所有套接字放入一个队列中,然后通过该队列以顺序、同步且一次一个套接字的方式将套接字传输到文件事件调度程序。

    文件调度程序从I/O多路复用器接收套接字,并根据套接字生成的事件类型调用响应事件处理程序。

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


    12.1.3事件的类型

    I/O复用器可以监听多个套接字的ae.h/AE_READABLE事件和ae.h/AE_WRITEABLE事件。这两种类型的事件和套接字 *** 作之间的对应关系如下:

  • 当套接字变得可读时(客户端在套接字上执行写 *** 作或关闭 *** 作),或者出现新的可接受的套接字时(客户端在服务器的监听套接字上执行连接 *** 作),套接字生成AE_READABLE事件。

  • 当套接字变得可写时(客户端在套接字上执行读 *** 作),套接字生成AE_WRITEABLE事件。

    如果一个套接字是可读可写的,那么服务器先读取套接字,然后再写入套接字。


    12.1.4API

    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.2API

    12.2.3时间事件应用实例:serverCron函数

    正在运行的Redis服务器需要定期检查和调整自身的资源和状态,以保证服务器的长期稳定运行。这些常规 *** 作由redis.c/serverCron函数执行,其主要工作包括:

  • 更新服务器的各种统计信息,如时间、内存占用、数据库占用等。

  • 清除数据库中过期的键值对。

    关闭并清理连接无效的客户端。

    努力坚持AOF或RDB。

    如果服务器是主服务器,则定期同步从属服务器。

    如果您处于集群模式,请对集群进行定期同步和连接测试。

    12.3事件的调度与执行


    事件调度和执行规则:

  • AEAPPoll函数的最大阻塞时间由到达时间最接近当前时间的时间事件决定。这种方法既能避免服务器频繁轮询时间事件,又能保证AEAPPoll函数不会阻塞太久。

  • 由于文件事件是随机发生的,如果等待处理一次文件事件后没有时间事件到达,服务器将再次等待处理文件事件。

    文件事件和时间事件的处理是同步、有序、原子地执行的,服务器不会中途中断事件处理,也不会抢占。所以无论是文件事件的处理者还是时间事件的处理者,他们都会尽量减少程序的阻塞时间,必要时主动放弃执行权,从而减少饿死事件的可能性。

    由于时间事件是在文件事件之后执行的,事件之间没有抢占,所以时间事件的实际处理时间通常比时间事件的设定到达时间稍晚。

    12.4重点回顾

  • Redis服务器是一个事件驱动程序,服务器处理的事件分为时间事件和文件事件。

  • 文件事件处理程序是一个基于Reactor模式的网络通信程序。

    文件事件是套接字 *** 作的抽象:每当套接字变得可接受、可写或可读时,就会生成相应的文件事件。

    文件事件分为AE_可读事件和AE_可写事件。

    时间事件分为定时事件和周期事件。

    一般情况下,服务器只执行一次函数的serverCron函数,这个事件是周期性事件。

    文本事件和时间事件之间存在合作关系。服务器会轮流处理这类事件,在处理事件的过程中不会出现抢占的情况。

    时间事件的实际处理时间通常会晚于设定的到达时间。


    欢迎分享,转载请注明来源:内存溢出

    原文地址: https://outofmemory.cn/zz/777752.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-05-03
    下一篇 2022-05-03

    发表评论

    登录后才能评论

    评论列表(0条)

    保存