redis(11)事件

1、redis服务器是一个事件驱动程序,包含两类事件:文件事件、时间事件

2、文件事件:服务器通过套接字与客户端进行连接,文件事件就是服务器对套接字操作的抽象,服务器与客户端的通信会产生相应文件事件,而服务器则通过监听并处理这些事件来完成一系列网络通信操作

时间事件:定时执行操作的抽象

3、redis基于reactor模式开发了自己网络事件处理器,这个处理器被称为文件事件处理器

文件事件处理器使用i/o多路复用(multiplexing)程序来同时监听多个套接字,根据套接字执行的任务来关联不同的事件处理器

当被监听的套接字准备好执行连接应答、读取、写入、关闭等操作时,相对应的文件事件就会产生,文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件

4、文件事件处理器的构成

四部分:套接字

、i/o多路复用程序、文件事件分派器、以及事件处理器

4.1、多路复用程序总会将所有产生事件的套接字都放到一个队列里面,有序、同步、每次一个套接字的方式向文件事件分派器传送套接字。文件分派器接收到套接字,并根据套接字产生的事件类型,调用相应的事件处理器

4.2、i/O多路复用的实现

redis的多路复用程序的所有功能都是通过包装常见的select、epoll、evport和kqueue这些i/o多路复用函数来实现的,

4.3、事件类型

AE_READABLE事件和AE_WRITABLE事件,

套接字可读时,如客户端对套接字执行write close操作,套接字产生AE_READABLE事件

套接字变得可写时,(客户端对套接字执行read操作),套接字产生AE_ARITABLE事件,当两种类型同时发生,文件事件分派器有限处理AE_READABLE

5、文件事件处理器

连接应答处理器、命令请求处理器、命令回复处理器、复制处理器(主从使用)

6、时间事件 分为两大类,定时事件、周期性事件

id:服务器为时间事件创建全局唯一id,递增

when:毫秒精度时间戳,记录时间时间到达时间

timeproc:时间事件处理器,一个函数

7、时间事件实现

服务器将所有时间事件放到一个无序链表,每当时间事件执行器运行时,它就遍历整个链表,查找所有已到达事件,并调用相应事件处理器

8、事件的调度与执行

8.1、aeapipoll函数最大阻塞时间由到达时间最接近当前时间的时间事件决定,可以避免服务器对时间事件频繁轮训,不会阻塞太久

8.2、文件事件是随机出现的,如果等待并处理完一次文件事件之后,仍未有任何时间事件,那么服务器将再次等待并处理文件事件,随着到达时间逼近,服务器就开始处理到达的时间时间

8.3、文件事件,时间事件都是同步、有序、原子、地执行的,不会中断处理,时间事件将非常耗时的持久化操作放到子线程或者子进程执行

8.4、时间事件在文件事件处理之后执行,并且事件之间不会出现抢断,所以通常时间时间会晚于到达时间处理

你可能感兴趣的:(redis(11)事件)