第14章 服务器
Rdis服务器负责与多个客户端建立网络连接,处理客户端发送的命令请求,在数据库中保存客户端执行命令所产生的数据,并通过资源管理来维持服务器自身的运转。
14.1 命令请求的执行过程
一条客户端命令如SET KEY VALUE命令从发送到收到回复共有4个步骤
发送命令请求: 用户输入的命令转换成协议, 然后发送给服务器
读取命令请求: 服务器上的连接socket可读事件就绪, 通过命令请求处理器读取套接字中协议格式的命令请求, 并保存到输入缓冲区, 再解析协议把参数和个数保存到argv, argc, 最后调用命令执行器执行.
查找命令实现:
根据argv[0]在命令表中查找(命令不区分大小写)对应的命令, 并保存到客户端状态的cmd属性中
进行一系列的检查, 如cmd是否为NULL, 参数个数正确? 客户端是否通过了身份验证? 检查内存占用情况等等
执行命令
执行后续工作, 如添加日志? 写入到AOF缓冲区? 传播给从服务器?等等
将命令回复发送给客户端: 先保存到输出缓冲区, 等待socket写入事件就绪后进行发送. 客户端接收到回复后, 以可读形式打印.
14.2 serverCron函数
该函数默认每100ms执行一次, 负责管理服务器的资源.
- 更新服务器的时间缓存
- 更新LRU时钟
- 更新服务器每秒执行命令次数
- 更新服务器内存峰值记录
- 处理SIGTERM信号
- 管理客户端资源
- 管理数据库资源
- 执行被延迟的BGREWRITEAOF
- 检查持久化操作的运行状态
- 将AOF缓冲区中的内容写入AOF文件
- 关闭异步客户端
- 增加cronloops计数器的值
14.3 初始化服务器
初始化服务器状态结构: 设置运行ID, 运行频率, 运行架构, 默认配置文件, 端口号, 持久化条件, 初始化LRU时钟, 创建命令表
载入配置选项
初始化服务器数据结构, 如clients链表, db数组, lua环境等等
还原数据库状态(载入AOF文件或RDB文件)
执行事件循环
- Title: 第14章 服务器
- Author: Huan Lee
- Created at : 2023-08-27 17:40:10
- Updated at : 2024-02-26 04:53:15
- Link: https://www.mirthfullee.com/2023/08/27/notion-第14章 服务器-b0fd0b68/
- License: This work is licensed under CC BY-NC-SA 4.0.