- Redis 服务器处理厂请求的过高
- serverCron 函数介绍
- 服务器的启动过程
命令请求的执行过程
在客户端这边:
- 用户在 Redis 客户端键入命令请求
- Redis 客户端将命令请求转换成协议格式
- Redis 客户端通过套接字发送请求给服务器
- Redis 客户端接受服务器的返回将消息转换成可读格式打印
服务器:
- 套接字中按协议格式读取命令
- 将命令请求保存到客户端状态的输入缓冲区
- 从输入缓冲区中解析命令
- 调用命令执行器执行命令
- 将返回结果写入客户端状态的输出缓冲区,并关联命令回复处理器
- 当 Socket 可写时,执行命令回复处理器写回给客户端
命令执行器又分为如下几个步骤:
- 查找命令。Redis 中存储一个命令表,是个字典结构;
- 执行预备操作。如检查参数个数、身份验证、检查是否正在执行订阅操作、是否在执行事务等等;
- 调用命令函数。将结果写回到客户端状态的输出缓冲区中;
- 执行后续工作。如慢查询日志记录、AOF持久化、命令传播给从服务器等。
serverCron 函数
serverCron 函数每 100 ms 执行一次,负责管理服务器的资源,并保持服务器的良好运转。
有以下几个任务:
- 更新服务器时间缓存(用于服务器中精度不高的时间使用上)
- 更新 LRU 时钟(redisServer.lruclock 属性,可通过 INFO server 进行查看;此属性减去对象的 lru 属性用于计算对象的空闲时间,用 OBJECT IDLETIME key 查看)
- 更新服务器每秒执行命令的次数记录值(INFO stats 查看 instantaneous_ops_per_sec 字段)
- 更新服务器内存峰值记录值(INFO memory 查看)
- 检查服务器状态 shutdown_asap 属性并处理是否关闭(服务器会拦截并优雅处理 SIGTERM 信号——做 RDB 持久化)
- 调用 clientsCron 函数(对客户端状态进行检查:关闭超时的连接、收缩过大的输入缓冲区)
- 调用 databasesCron 函数(对一部分数据库进行检查,删除过期键、收缩字典等)
- 执行被延迟的 BGREWRITEAOF(此命令的执行会在判断 BGSAVE 是否需要执行且已被执行之后执行)
- 检查持久化操作的运行状态,执行或替换 RDB、AOF 等(有记录子进程的 pid)
- 将 AOF 缓冲区写入 AOF 文件
- 关闭异常客户端(如输出缓冲区过大的)
- 增加 cronloops 计数器的值(记录 serverCron 的执行次数)
初始化服务器过程
一个 Redis 服务器启动时:
- 创建 redisServer 结构体实例
- 设置运行ID、默认运行频率、默认配置文件路径、端口号、持久化条件、LRU时钟、创建命令表等
- 载入配置选项
- 初始化服务器数据结构(server 上的属性)
- 还原数据库状态:自动载入 RDB、AOF 文件(AOF开启时用 AOF,关闭时用 RDB)
- 开始执行事件循环
网友评论