一、概述:
redis 服务器是一个事件驱动的程序,服务器处理的时间分为时间事件和文件事件两类。redis
二、文件事件
2.一、redis基于Reactor模式开发了本身的网络时间处理器:这个处理器被称为文件事件处理器。服务器
- 文件事件处理器使用I/O多路复用程序来同时监听多个套接字,并根据套接字目前执行的任务来为套接字关联不一样的事件处理器。
- 当被监听的套接字准备好执行链接应答(accept)、读取(read)、写入(write)、关闭(close)等操做时, 与操做相对应的文件事件就会产生, 这时文件事件处理器就会调用套接字以前关联好的事件处理器来处理这些事件。
尽管多个文件事件可能会并发地出现, 但 I/O 多路复用程序老是会将全部产生事件的套接字都入队到一个队列里面, 而后经过这个队列, 以有序(sequentially)、同步(synchronously)、每次一个套接字的方式向文件事件分派器传送套接字: 当上一个套接字产生的事件被处理完毕以后(该套接字为事件所关联的事件处理器执行完毕), I/O 多路复用程序才会继续向文件事件分派器传送下一个套接字, 如图 IMAGE_DISPATCH_EVENT_VIA_QUEUE 。
2.二、I/O 多路复用程序的实现
2.三、一次完整的客户端与服务器链接事件示例 让咱们来追踪一次 Redis 客户端与服务器进行链接并发送命令的整个过程, 看看在过程当中会产生什么事件, 而这些事件又是如何被处理的。
假设一个 Redis 服务器正在运做, 那么这个服务器的监听套接字的 AE_READABLE 事件应该正处于监听状态之下, 而该事件所对应的处理器为链接应答处理器。网络
若是这时有一个 Redis 客户端向服务器发起链接, 那么监听套接字将产生 AE_READABLE 事件, 触发链接应答处理器执行: 处理器会对客户端的链接请求进行应答, 而后建立客户端套接字, 以及客户端状态, 并将客户端套接字的 AE_READABLE 事件与命令请求处理器进行关联, 使得客户端能够向主服务器发送命令请求。并发
以后, 假设客户端向主服务器发送一个命令请求, 那么客户端套接字将产生 AE_READABLE 事件, 引起命令请求处理器执行, 处理器读取客户端的命令内容, 而后传给相关程序去执行。函数
执行命令将产生相应的命令回复, 为了将这些命令回复传送回客户端, 服务器会将客户端套接字的 AE_WRITABLE 事件与命令回复处理器进行关联: 当客户端尝试读取命令回复的时候, 客户端套接字将产生 AE_WRITABLE 事件, 触发命令回复处理器执行, 当命令回复处理器将命令回复所有写入到套接字以后, 服务器就会解除客户端套接字的 AE_WRITABLE 事件与命令回复处理器之间的关联。3d
图 IMAGE_COMMAND_PROGRESS 总结了上面描述的整个通信过程, 以及通信时用到的事件处理器。cdn
三、时间事件
3.一、redis的时间事件分为定时事件和周期性事件。server
- 当时间事件处理器返回AE_NOMORE则表明是定时事件,放返回一个整数时,若是30,表明30毫秒再次到达,服务器会更新when的时间戳。
3.二、服务端能够经过函数建立删除时间事件。 blog
- ae.c/aeCreateTimeEevent(long milliseconds,Hander proc) 建立
- ae.c/aeDeleteFileEvent(long id) 删除 3.三、代码逻辑
其中processFileEvents()是伪代码,从代码逻辑中能够看出,redis服务端会先执行文件事件在执行时间事件。
重点
- Redis 服务器是一个事件驱动程序, 服务器处理的事件分为时间事件和文件事件两类。
- 文件事件处理器是基于 Reactor 模式实现的网络通信程序。 文件事件是对套接字操做的抽象: 每次套接字变得可应答(acceptable)、可写(writable)或者可读(readable)时, 相应的文件事件就会产生。
- 文件事件分为 AE_READABLE 事件(读事件)和 AE_WRITABLE 事件(写事件)两类。
- 时间事件分为定时事件和周期性事件: 定时事件只在指定的时间达到一次, 而周期性事件则每隔一段时间到达一次。
- 服务器在通常状况下只执行 serverCron 函数一个时间事件, 而且这个事件是周期性事件。
- 文件事件和时间事件之间是合做关系, 服务器会轮流处理这两种事件, 而且处理事件的过程当中也不会进行抢占。
- 时间事件的实际处理时间一般会比设定的到达时间晚一些。