redis学习(五) --- 事件
redis服务器是一个事件驱动程序,服务器需要处理两种事件类型:
- 文件事件:redis服务器通过套接字与客户端连接,而文件事件就是服务器对套接字的抽象,服务端则通过监听和处理事件来完成网络通信
- 时间事件:在给定的时间执行的事件
文件事件
redis基于rector模式处理网络事件,称为文件事件处理器。
如图中,文件事件处理器的四个部分:
- 套接字:每当一个套接字准备好执行连接应答,写入,读取,关闭等操作的时候,会产生一个文件事件
- I/O多路复用程序:负责监听多个套接字,并向文件事件分派器传送那些产生事件的套接字。I/O多路复用程序会将所有产生的事件的套接字都放在一个队列中,然后通过队列,有序的同步的,每次一个套接字的方式向文件事件分派器传送套接字。当上一个套接字产生的事件被处理完之后,才会向分派器分发下一个套接字。
- 包装了常见的select,poll,epoll等多路复用,程序会在运行时选择性能最高的方式
- 套接字产生的事件分为可读和可写。但是同一个套接字可以同时产生这两种事件,那么会优先处理可读事件。
- 文件事件分派器:接受套接字,根据产生的事件调用响应的处理器
- 事件处理器:是一个个函数,具体的处理。有以下几个主要的处理器:
- 连接应答处理器:对连接服务器的各个客户端进行应答,套接字产生可读事件
- 命令请求处理器:为了接受客户端传来的命令请求,套接字产生可读事件
- 命令回复处理器:为客户端返回命令的执行结果,套接字产生可写事件
上图是客户端一次与服务端建立连接,并发送命令的流程。
时间事件
时间事件分为以下两类:
- 定时事件:在指定时间之后执行一次
- 周期性事件:每隔一段时间执行一次
一个时间事件由三个属性组成:
- ID:全局唯一ID,从小到大产生,新的事件的ID比旧事件的ID大
- when:记录时间事件的到达时间。
- timeproc:一个函数,当时间事件到达时,服务器会调用相应的事件处理器