【Redis】 服务器
【Redis】 服务器
Metadata
title: 【Redis】 服务器
date: 2023-07-09 08:42
tags:
- 行动阶段/完成
- 主题场景/数据存储
- 笔记空间/KnowladgeSpace/ProgramSpace/BasicsSpace
- 细化主题/数据存储/Redis
categories:
- 数据存储
keywords:
- 数据存储/Redis
description: 【Redis】 服务器
概述
简而言之,这章就是在解释客户端输入 Redis 指令到返回结果的执行过程。
- 一个命令请求从发送到完成主要包括以下步骤:
- 客户端将命令请求发送给服务器;
- 服务器读取命令请求,并分析出命令参数;
- 命令执行器根据参数查找命令的实现函数,然后执行实现函数并得出命令回复;
- 服务器将命令回复返回给客户端。
- serverCron函数默认每隔100毫秒执行一次,它的工作主要包括
- 更新服务器状态信息,
- 处理服务器接收的SIGTERM信号,
- 管理客户端资源和数据库状态,
- 检查并执行持久化操作等等。
- 服务器从启动到能够处理客户端的命令请求需要执行以下步骤:
- 初始化服务器状态;
- 载入服务器配置;
- 初始化服务器数据结构;
- 还原数据库状态;
- 执行事件循环。
初始化服务器
首先是 Redis 服务器初始化操作,服务器从启动到能够处理客户端的命令请求需要执行以下步骤:
- 初始化服务器状态。
- 载入服务器配置。
- 初始化服务器数据结构。
- 还原数据库状态。
- 执行事件循环。
初始化服务器状态结构
主要是对 redisServer 结构体的初始化,包括设置服务器运行 ID,运行频率,设置配置文件路径,设置持久化条件,命令表创建等。
载入配置选项
根据用户设定的配置,对 redisServer 相关变量的值进行修改,比如端口号,数据库数量,RDB 的压缩是否开启等等。其他属性还是沿用默认值。
初始化服务器数据结构
服务器必须先载入用户配置,才能对其他数据结构进行准确初始化。其他数据结构包括客户端链表,db 数组,订阅信息,Lua 脚本执行环境,慢查询日志相关属性等等。
还原数据库状态
载入 RDB 或 AOF 文件的数据恢复过程。
执行事件循环
至此,服务器可接收客户端请求并发送信息。
命令执行过程
以SET key value
为例,命令的执行过程是:
- 客户端发送命令。
- 服务器接收并处理请求,对数据库操作,回复 OK。
- 服务器将命令回复给客户端。
- 客户端接收命令并打印结果。
下面将按照步骤拆解为发送,读取查找,执行预备操作,调用实现函数,执行后续工作,回复,打印操作讲解。
发送
客户端接收命令请求时,会将命令根据协议转为固定格式再发送给服务器。
读取
当套接字因客户端的写入变得可读时,服务器会先读取协议格式内容并保存到输入缓冲区。命令分析,提取参数及个数,存入 argv 和 argc 属性。最后调用命令执行器。
命令执行器 - 查找命令的实现
命令表是一个字典,键是命令名字,值是 redisCommand 结构。几个重要属性如下:
- name:命令名称。
- proc:指向命令实现函数。
- arity:命令参数个数,包括命令名称。
- sflags:命令属性。
查找命令表的过程就是找到 redisCommand,把指针指向它:
命令执行器 - 执行预备操作
在命令真正执行前需要有预备操作保证命令可以被正确,顺利地执行。这个环节相当于一层过滤,比如检查命令是否正确,参数是否正确,身份验证是否通过,内存是否够用等等。保证配置生效,准确执行。
命令执行器 - 调用命令的实现函数
执行过程就是调用之前找到并指向的执行函数。通过 client->cmd->proc(client); 调用。然后将回复保存在客户端状态的输出缓冲区中,关联该套接字的命令回复处理器。
命令执行器 - 执行后续工作
有一些善后工作还将继续,比如慢查询日志记录,执行时长记录,AOF 持久化,主服务器将命令传给从服务器。当这些都处理完后,服务器就继续从文件时间处理器中取出并执行下一个命令请求。
将命令回复发送给客户端
当客户端套接字变为可写状态,服务器执行命令回复处理器,将输出缓冲区的回复发送给客户端。
客户端接收并打印命令回复
将回复转为人类可读的格式,打印给用户看。