Mini-Redis 学习分析(一)
0x01 服务端启动过程
Server
服务端启动时,首先初始化 Listener 实例,准备接收客户端连接。
Listener
Listener 负责管理服务端的核心组件:
| 变量 | 描述 |
|---|---|
db_holder |
持有数据库实例 |
listener |
TCP 监听器,负责接收客户端连接 |
limit_connections |
连接数限制器,类型为 Arc<Semaphore> |
notify_shutdown |
用于广播关闭信号的通知器 |
shutdown_complete_tx |
用于确认关闭完成的发送端 |
run 方法
run 方法进入主循环,持续监听新连接。每当有客户端接入时,会创建一个 Handler 实例来处理该连接。
Handler
Handler 负责处理单个客户端连接的全生命周期,包括读取请求、解析命令和执行操作。
0x02 命令处理流程
命令处理分为以下三个阶段:
1. 读取帧数据
通过 Connection::read_frame 方法从 socket 读取原始数据,并解析为 Frame 结构。
Mini-Redis 协议帧类型
类型 格式 示例 简单字符串 +内容\r\n+OK\r\n错误 -内容\r\n-ERR unknown\r\n整数 :数字\r\n:1000\r\n批量字符串 $长度\r\n内容\r\n$5\r\nhello\r\n空值 $-1\r\n$-1\r\n数组 *数量\r\n元素...*2\r\n$3\r\nfoo\r\n$3\r\nbar\r\n
2. 解析命令
当完整的 Frame 解析完成后,调用 Command::from_frame 将其转换为具体的 Command 枚举类型。
3. 执行命令
最后调用 Command::apply 方法,将命令执行结果应用到数据库中,并将响应返回给客户端。