Redis设计与实现读书笔记---事件/客户端/服务器

2021/10/6 19:40:58

本文主要是介绍Redis设计与实现读书笔记---事件/客户端/服务器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

事件

Redis服务器是一个事件驱动程序,主要处理文件事件和事件事件。

文件事件

Redis基于Reactor模式开发网络事件处理器,即文件事件处理器。

文件事件处理器主要由四个部分组成,套接字,I/O多路复用程序,文件事件分派器,事件处理器。处理流程如下:

  1. 服务器与客户端通过套接字(Socket)进行通信,当套接字准备好执行连接应答、写入、读取、关闭等操作的时候,就会产生文件事件;
  2. I/O多路复用程序负责监听多个套接字,并将套接字产生的事件塞入一个队列中,然后文件事件分派器将事件分派给对应的事件处理器。

事件类型

AE_READABLE:可读事件

AE_WRITABLE:可写事件

对于同一个套接字产生的两个事件,优先处理可读事件。

文件事件处理器

连接应答处理器:为对连接服务器的各个客户端进行应答,服务器要为监听套接字关联连接应答处理器

命令请求处理器:为了接收客户端传来的命令请求,服务器为客户端套接字关联命令请求处理器

命令回复处理器:为了向客户端返回命令的执行结果,服务器为客户端套接字关联命令回复处理器

复制处理器:当主服务器和从服务器进行复制操作时,主从服务器都需要关联特别为复制功能编写的复制处理器

时间事件

定时事件:让程序在指定时间之后执行一次。

周期性事件:让程序每隔指定时间就执行一次。

客户端

Redis服务器是一个典型的一对多的服务器程序:一个服务器可以与多个客户端建立网络连接,每个客户端可以向服务器发送命令请求,而服务器负责接收客户端的命令请求,并向客户端发送命令回复。

服务器维护的客户端的数据结构

struct redisServer{
	//一个链表,维护所有客户端状态
	list *clients;
}

客户端维护的信息

客户端的套接字描述符;

客户端的名字;

客户端的标志值;

指向客户端正在使用的数据库的指针,以及数据库的号码;

客户端当前执行的命令、命令参数,命令个数,以及命令实现函数的指针;

客户端的输入输出缓冲区;

客户端复制状态信息,复制所需的数据结构;

客户端执行阻塞命令需要的数据结构;

客户端的事务状态;

客户端执行发布订阅所需的数据结构;

客户端的身份验证标志;

客户端的创建时间

服务器

Redis服务器负责与多个客户端建立网络连接,处理客户端发送的命令请求,在数据库中保存客户端执行命令所产生的数据,并通过资源管理来维持服务器自身的运转。

命令请求的执行流程

  1. 客户端向服务器发送命令请求;
  2. 服务器接收并处理客户端发送的命令请求,在数据库中进行设置操作,并产生命令回复OK;
  3. 服务器将命令回复发送给客户端;
  4. 客户端接收到服务器返回的命令回复,并打印内容显式给用户;

发送命令请求

redis服务器收到客户端的命令请求,将命令请求转换成协议格式,然后通过连接到服务器的套接字,将协议格式的命令上送服务器;

读取命令请求

客户端与服务器之间的连接套接字因为客户端的命令输入变得可读,服务器通过关联命令请求 处理器来处理请求命令。

  1. 服务器读取套接字中协议格式的命令请求,并将其保存到客户端状态的输入缓冲区里面;
  2. 对输入缓冲区中的命令请求进行分析,提取命令中的命令参数和参数个数,分别将参数和参数个数保存到客户端状态的argv属性和argc属性;
  3. 调用命令执行器,执行客户端指定的命令。

命令执行器

  1. 查找命令实现:服务器中维护一个命令表的字典,表中记录各个命令的具体实现函数;
  2. 执行预备操作:判断当前的服务器是否具备执行预备操作的条件,如命令实现函数是否存在,命令参数是否正确,服务器是否进行内存回收,服务器是否进行备份操作等;
  3. 调用命令实现函数;
  4. 执行后续工作:日志同步,数据复制等

将命令回复发送客户端

命令实现函数将命令回复保存到客户端的输出缓冲区中,并为客户端的套接字关联命令回复处理器,当客户端套接字变为可写状态时,服务器就会执行命令回复处理器,将保存在客户端输出缓冲区中的命令回复发送客户端。命令回复后,会清空缓冲区中的内容,为下一个请求做准备。

serverCron函数

该函数默认每隔100毫秒执行一次,负责管理服务器资源,并保持服务器自身的良好运转。

服务器中维护了两种获取时间的方式,一种是通过serverCron函数定时刷新unixtime和mstime,这两个属性记录的时间的精度并不高,适用于日志打印,更新服务器的LRU时钟,决定是否执行持久化任务等对时间精确度要求不高的功能上;对于设置键过期时间,添加慢日志查询这些需要高精度时间的功能,服务器会执行系统调用获取最准确的系统时间。

服务器从启动到能够处理客户端的命令需要执行以下步骤:

  1. 初始化服务器状态;
  2. 载入服务器配置;
  3. 初始化服务器数据结构;
  4. 还原数据库状态;
  5. 执行事件循环;


这篇关于Redis设计与实现读书笔记---事件/客户端/服务器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程