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
  • 相关阅读:
    how to pass a Javabean to server In Model2 architecture.
    What is the Web Appliation Archive, abbreviation is "WAR"
    Understaning Javascript OO
    Genetic Fraud
    poj 3211 Washing Clothes
    poj 2385 Apple Catching
    Magic Star
    关于memset的用法几点
    c++ 函数
    zoj 2972 Hurdles of 110m
  • 原文地址:https://www.cnblogs.com/SmartCat994/p/14154919.html
Copyright © 2011-2022 走看看