Redis服务器是一个事件驱动程序,主要处理文件事件和事件事件。
Redis基于Reactor模式开发网络事件处理器,即文件事件处理器。
文件事件处理器主要由四个部分组成,套接字,I/O多路复用程序,文件事件分派器,事件处理器。处理流程如下:
AE_READABLE:可读事件
AE_WRITABLE:可写事件
对于同一个套接字产生的两个事件,优先处理可读事件。
连接应答处理器:为对连接服务器的各个客户端进行应答,服务器要为监听套接字关联连接应答处理器
命令请求处理器:为了接收客户端传来的命令请求,服务器为客户端套接字关联命令请求处理器
命令回复处理器:为了向客户端返回命令的执行结果,服务器为客户端套接字关联命令回复处理器
复制处理器:当主服务器和从服务器进行复制操作时,主从服务器都需要关联特别为复制功能编写的复制处理器
定时事件:让程序在指定时间之后执行一次。
周期性事件:让程序每隔指定时间就执行一次。
Redis服务器是一个典型的一对多的服务器程序:一个服务器可以与多个客户端建立网络连接,每个客户端可以向服务器发送命令请求,而服务器负责接收客户端的命令请求,并向客户端发送命令回复。
服务器维护的客户端的数据结构
struct redisServer{ //一个链表,维护所有客户端状态 list *clients; }
客户端的套接字描述符;
客户端的名字;
客户端的标志值;
指向客户端正在使用的数据库的指针,以及数据库的号码;
客户端当前执行的命令、命令参数,命令个数,以及命令实现函数的指针;
客户端的输入输出缓冲区;
客户端复制状态信息,复制所需的数据结构;
客户端执行阻塞命令需要的数据结构;
客户端的事务状态;
客户端执行发布订阅所需的数据结构;
客户端的身份验证标志;
客户端的创建时间
Redis服务器负责与多个客户端建立网络连接,处理客户端发送的命令请求,在数据库中保存客户端执行命令所产生的数据,并通过资源管理来维持服务器自身的运转。
redis服务器收到客户端的命令请求,将命令请求转换成协议格式,然后通过连接到服务器的套接字,将协议格式的命令上送服务器;
客户端与服务器之间的连接套接字因为客户端的命令输入变得可读,服务器通过关联命令请求 处理器来处理请求命令。
命令实现函数将命令回复保存到客户端的输出缓冲区中,并为客户端的套接字关联命令回复处理器,当客户端套接字变为可写状态时,服务器就会执行命令回复处理器,将保存在客户端输出缓冲区中的命令回复发送客户端。命令回复后,会清空缓冲区中的内容,为下一个请求做准备。
该函数默认每隔100毫秒执行一次,负责管理服务器资源,并保持服务器自身的良好运转。
服务器中维护了两种获取时间的方式,一种是通过serverCron函数定时刷新unixtime和mstime,这两个属性记录的时间的精度并不高,适用于日志打印,更新服务器的LRU时钟,决定是否执行持久化任务等对时间精确度要求不高的功能上;对于设置键过期时间,添加慢日志查询这些需要高精度时间的功能,服务器会执行系统调用获取最准确的系统时间。
服务器从启动到能够处理客户端的命令需要执行以下步骤: