zoukankan      html  css  js  c++  java
  • Redis设计与实现(十一)事件

    Redis服务器是一个事件驱动程序,服务器需要处理两类事件,一种是文件事件,例如client发来的请求,或者其他redis服务器发来的请求。一种是时间事件,例如之前提到的RDB的检测事件(ServerCron),会自发的进行,到某个时间节点了就会进行。

    文件事件是基于Redis自己开发的网络事件处理器(参考的是reactor)。使用了多路复用来对对监听到的请求进行处理,然后多路复用讲请求放入队列,通过队列再发送给文件事件分配器,文件事件分配器再将东西发给合适的事件处理器

     多路复用器负责接受Socket传送过来的内容放入队列。这个队列是一个同步的,有序的,发送给文件事件分配器。当发送的套接字完成之后,队列才会继续向文件事件分配器继续发送接收到的套接字。分配器根据套接字的请求不同再分发给事件处理器。

     多路复用器是通过包装Linux中常见的select,epoll,evport和kqueue这些常见的多路复用函数库进行的。这些多路复用函数库,在Redis中都是独立的文件存在,例如epoll.c——>ae_epoll.c

    在Redis中多路复用库的API是相同的功能,可以进行随意的相互切换,例如epoll切换成select。

    在Redis中会根据系统中效率最高的多路复用库来作为多路复用的底层实现。拓展Redis是如何进行多路复用的选择

     多路复用器可以监听多个套接字的AE_READABLE事件和AE_WATCABLE事件。这两类事件和套接字操作之间的对应关系:

    当套接字可读的时候(拓展套接字可读可写的条件),套接字会在文件事件分发器中发给READABLE的处理器。WRITE也是这样的一个操作。

     Redis为文件事件创建了多个处理器,这些事件分别用于实现不同的网络通信需求

    为了对连接服务器的多个客户端进行应答--->命令请求处理器

    返回套接字触发的事件的结果--->关联命令回复处理器

    为主从架构之间通信--->复制功能编写的复制处理器

    一次完整的Redis通信的过程

    AE_READABLE事件处于监听的情况,有一个套接字发送了过来,触发了AE_READABLE事件,AE_RADABLE事件传送至触发连接应答处理器。处理器对客户端的连接请求进行应答。然后创建客户端套接字,以及客户端状态,然后将AE_READABLE事件与命令请求处理器进行关联。使得客户端可以向主服务器发起命令请求。

    执行完命令之后,会触发AE_WRITABLE事件与命令回复处理器管理起,当客户端尝试获取命令的时候就促使AE_WRITABLE触发器执行。最后会解除之间的关联。

     时间事件有两类:定时和周期,定时指在指定时间执行一次,周期指每隔一段时间执行一次

    一个时间事件主要有以下三个属性组成,id:服务器为时间事件创建全局唯一的ID,ID号从小到大的顺序递增,新事件的ID号会比老的大。

    when:按照毫秒进行更新的UNIX时间戳,记录了时间事件的到达时间

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

    一个时间事件是周期的还是定时的,取决于时间事件的返回值

    如果是ae.h/AE_NOMORE就是定时,如果是非AE_NOMORE的整数值就是一个周期性事件。返回值会更新when的值,方便在下次的时候再次进行操作。

    redis使用一个无序链表(顺序和time_event中的when无关),来存放所有的时间事件,每当有时间执行器执行的时候就会遍历整个链表。

     在redis的思想中,事件和触发器是两个概念。但是他们两个是相互关联的。有点类似方法和方法的形参之间的感觉。

    既然有时间事件和文件事件服务器就必须对这两个事件进行调度,通过acProcessEvents函数负责

     

     aeApiPoll函数的最大阻塞时间由到达时间最接近当前时间的时间事件决定。这样可以避免空轮询,也确保不会阻塞特别久。对时间还是文件事件的执行都是有序的,原子的,同步的,不会有任何的抢断

     

    smartcat.994
  • 相关阅读:
    win7 删除Windows服务的方法
    如何对SQL Server 2005进行设置以允许远程连接(转载)
    MySql实现远程连接
    OpenCV训练分类器制作xml文档
    Ms SQL Server 约束和规则
    PowerDesigner实用技巧小结(4)
    企业级技术解决方案:hbase+es
    ES的聚合操作
    es之过滤器
    es之得分(加权)
  • 原文地址:https://www.cnblogs.com/SmartCat994/p/14154919.html
Copyright © 2011-2022 走看看