【Redis】 服务器

Metadata

title: 【Redis】 服务器
date: 2023-07-09 08:42
tags:
  - 行动阶段/完成
  - 主题场景/数据存储
  - 笔记空间/KnowladgeSpace/ProgramSpace/BasicsSpace
  - 细化主题/数据存储/Redis
categories:
  - 数据存储
keywords:
  - 数据存储/Redis
description: 【Redis】 服务器

概述

简而言之,这章就是在解释客户端输入 Redis 指令到返回结果的执行过程

  • 一个命令请求从发送到完成主要包括以下步骤:
    1. 客户端将命令请求发送给服务器;
    2. 服务器读取命令请求,并分析出命令参数;
    3. 命令执行器根据参数查找命令的实现函数,然后执行实现函数并得出命令回复;
    4. 服务器将命令回复返回给客户端。
  • serverCron函数默认每隔100毫秒执行一次,它的工作主要包括
    1. 更新服务器状态信息,
    2. 处理服务器接收的SIGTERM信号,
    3. 管理客户端资源和数据库状态,
    4. 检查并执行持久化操作等等。
  • 服务器从启动到能够处理客户端的命令请求需要执行以下步骤:
    1. 初始化服务器状态;
    2. 载入服务器配置;
    3. 初始化服务器数据结构;
    4. 还原数据库状态;
    5. 执行事件循环。

初始化服务器

首先是 Redis 服务器初始化操作,服务器从启动到能够处理客户端的命令请求需要执行以下步骤:

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

初始化服务器状态结构

主要是对 redisServer 结构体的初始化,包括设置服务器运行 ID,运行频率,设置配置文件路径,设置持久化条件,命令表创建等。

载入配置选项

根据用户设定的配置,对 redisServer 相关变量的值进行修改,比如端口号,数据库数量,RDB 的压缩是否开启等等。其他属性还是沿用默认值。

初始化服务器数据结构

服务器必须先载入用户配置,才能对其他数据结构进行准确初始化。其他数据结构包括客户端链表,db 数组,订阅信息,Lua 脚本执行环境,慢查询日志相关属性等等。

还原数据库状态

载入 RDB 或 AOF 文件的数据恢复过程。

执行事件循环

至此,服务器可接收客户端请求并发送信息。

命令执行过程

SET key value为例,命令的执行过程是:

  1. 客户端发送命令。
  2. 服务器接收并处理请求,对数据库操作,回复 OK。
  3. 服务器将命令回复给客户端。
  4. 客户端接收命令并打印结果。

下面将按照步骤拆解为发送,读取查找,执行预备操作,调用实现函数,执行后续工作,回复,打印操作讲解。

发送

客户端接收命令请求时,会将命令根据协议转为固定格式再发送给服务器。

读取

当套接字因客户端的写入变得可读时,服务器会先读取协议格式内容并保存到输入缓冲区。命令分析,提取参数及个数,存入 argv 和 argc 属性。最后调用命令执行器。

命令执行器 - 查找命令的实现

命令表是一个字典,键是命令名字,值是 redisCommand 结构。几个重要属性如下:

  • name:命令名称。
  • proc:指向命令实现函数。
  • arity:命令参数个数,包括命令名称。
  • sflags:命令属性。

查找命令表的过程就是找到 redisCommand,把指针指向它:

命令执行器 - 执行预备操作

在命令真正执行前需要有预备操作保证命令可以被正确,顺利地执行。这个环节相当于一层过滤,比如检查命令是否正确,参数是否正确,身份验证是否通过,内存是否够用等等。保证配置生效,准确执行。

命令执行器 - 调用命令的实现函数

执行过程就是调用之前找到并指向的执行函数。通过 client->cmd->proc(client); 调用。然后将回复保存在客户端状态的输出缓冲区中,关联该套接字的命令回复处理器。

命令执行器 - 执行后续工作

有一些善后工作还将继续,比如慢查询日志记录,执行时长记录,AOF 持久化,主服务器将命令传给从服务器。当这些都处理完后,服务器就继续从文件时间处理器中取出并执行下一个命令请求。

将命令回复发送给客户端

当客户端套接字变为可写状态,服务器执行命令回复处理器,将输出缓冲区的回复发送给客户端。

客户端接收并打印命令回复

将回复转为人类可读的格式,打印给用户看。