redis服务器是一个事件驱动程序,服务器需要处理以下两种事件
1、文件事件:redis服务器通过套接字与客户端进行连接,而文件事件就是服务器对套接字操作的抽象,服务器和客户端的通信会产生相应的事件,服务器就是通过监听并处理这些事件来完成一系列网络通信操作。
2、时间事件:redis服务器的一些操作(如serverCron函数)需要在给定的时间点执行,而时间事件就是服务器对这类定时操作的抽象。
文件事件
redis基于Reactor模式开发了自己的网络事件处理器,这个处理器被称为文件事件处理器。
文件事件处理器的构成
分别是套接字、I/O多路复用程序、文件事件分派器以及事件处理器。
i/o多路复用程序,会将产生事件的套接字放置一个队列,通过队列以有序、同步的、每次一个套接字的方式向文件事件分派器传送套接字,文件事件分派器根据套接字选择事件处理器执行。
文件事件处理器
1、连接应答处理器:对连接服务器的各个客户端进行应答
当redis服务器初始化的时候,程序会将这个连接应答处理器和服务器监听套接字的AE_READABLE事件关联,当客户端调用socker、connect连接服务器监听套接字的时候,套接字就会产生AE_READABLE事件,引发连接应答处理器执行。
2、命令请求处理器:处理客户端传来的命令请求
当一个客户端通过连接应答处理器成功连接服务器后,服务器会将客户端套接字的AE_READABLE事件和命令请求处理器关联起来,当客户端向服务器发送命令请求的时候,会引发命令请求处理器,并执行相应的套接字读入操作。
3、命令回复处理器:向客户端返回命令的执行结果
当服务器有命令回复需要发送给客户端的时候,服务器会将客户端的AE_WRITABLE事件和命令回复处理器关联起来,当客户端准备好接收传回的命令回复时,就会产生AE_WRITABLE事件,引发命令回复处理器执行并执行响应的套接字写操作。
4、复制处理器:处理主从复制的相关操作
客户端与服务端的通信过程
时间事件
时间事件分为定时事件和周期性事件
实现:服务器将所有的时间事件都放在了一个无序链表中(每次会将新增的时间事件插入到链头中,无序指的是没有按时间排序),每当时间事件执行器运行时,它就遍历整个链表,查找已经到达的时间事件并执行。
事件的调度与执行