一个命令请求从发送到完成的步骤

如下:
1、客户端将命令请求发送给服务器

  • 当用户在客户端中键入一个命令请求时,客户端会将这个命令请求转换成协议格式,然后通过连接到服务器的套接字,将协议格式的命令请求发送给服务器。

2、服务器读取命令请求,并分析出命令参数

  • 读取套接字中协议格式的命令请求,将其保存到客户端状态的输入缓冲区中
  • 对输入缓冲区中的命令请求进行解析,提取出命令参数以及命令参数的个数,保存到客户端状态的argv属性与argc属性
  • 调用命令执行器,执行指定指令

3、命令执行器根据参数查找命令的实现函数,然后执行实现函数并得到命令回复

  • 根据客户端状态的argv[0]参数,在命令表中查找参数所指定的命令,并将找到的命令保存到客户端状态的cmd属性里
  • 执行预备操作,确保命令可以正确执行(一些检查操作)
  • 将客户端状态指针作为参数传入实现函数,进行执行
  • 执行后续工作
  • 若开启了慢查询日志功能,模块会检查是否需要给刚刚执行完的命令添加一条慢查询日志
  • 若开启了AOF持久化,模块会将刚刚执行的命令请求写入到AOF缓冲区中
  • 如果有从服务器正在复制当前服务器,将刚刚执行的命令传播给所有从服务器

4、服务器将命令回复返回给客户端

  • 命令回复一开始保存在客户端状态的输出缓冲区里,并为客户端的套接字关联命令回复处理器
  • 当客户端套接字变为可写状态时,服务器会执行命令回复处理器,将保存在客户端输出缓冲区的命令回复发送给客户端
  • 命令回复发送完毕,回复处理器清空客户端状态的输出缓冲区
  • 客户端结收到协议格式的命令回复后,解析并打印

初始化服务器步骤

1、初始化服务器状态
创建struct redisServer类型的实例变量,server作为服务器的状态,并为结构中的各个属性设置默认值
例如:

设置服务器的运行ID
设置服务器的默认运行频率
设置服务器的默认配置文件路径
设置服务器的运行架构
设置服务器的默认端口号
设置服务器的默认RDB持久化条件和AOF持久化条件
初始化服务器的LRU时钟 创建命令表

2、载入服务器配置
3、初始化服务器数据结构
除了命令表之外,服务器状态还包含其他数据结构

  • server.clients链表,记录了所有与服务器相连的客户端的状态结构,链表的每个节点都包含了一个redisClient结构实例
  • server.db数组,数组中包含了服务器的所有数据库
  • server.pubsub_channels,用于保存频道订阅信息的字典
  • server.pubsub_patterns,用于保存模式订阅信息的链表
  • servber.lua,用于执行Lua脚本的Lua环境
  • server.slowlog,用于保存慢查询日志
    之后调用initServer函数,为数据结构分配内存,并且设置初始化值(通过配置文件的参数)
    当然该函数还进行了一些更加重要的操作:
  • 为服务器设置进程信号处理器
  • 创建共享对象,之后服务器将通过重用共享对象来避免反复创建相同的对象
  • 打开服务器的监听端口,并为监听套接字关联连接应答事件处理器,等待服务器正式运行时接收客户端的连接
  • 创建时间事件
  • 若AOF持久化功能开启,那么打开现有的AOF文件,若文件不存在,新建一个
  • 初始化服务器后台的I/O模块

4、还原数据库状态

  • 如果启用了AOF持久化功能,用AOF文件还原数据库状态
  • 否则,使用RDB文件还原

5、执行事件循环