《Redis设计与实现》第十四章总结一:服务器运行流程

6 服务器

以命令SET KEY VALUE为例进行讲解

6.1 命令请求的执行过程

从客户端发送此命令到获取回复OK期间,客户端+服务端所执行的4个步骤:
在这里插入图片描述

6.1.1 步骤1:发送命令请求

流程:
在这里插入图片描述
如命令SET KEY VALUE,转换为协议:
在这里插入图片描述#### 6.1.2 步骤2:读取命令请求

1.读取socket中协议格式的命令请求,保存到客户端状态的输入缓冲区里面:
在这里插入图片描述
2.对输入缓冲区中的命令请求进行分析,提取出命令请求中包含的命令参数以及个数,分别保存到argv和argc属性里面:
在这里插入图片描述
3.调用命令执行器,执行客户端指定的命令

6.1.2.1 命令执行器(1):查找命令

根据客户端状态的argv[0]参数,在命令表中查找参数所指定的命令,并将找到的命令对应的redisCommand结构保存到客户端状态的cmd属性里面,即cmd这个指针指向此redisCommand结构

redisCommand结构主要属性:name、arity、sflags、flags、calls、milliseconds
在这里插入图片描述
sflags属性的标识值:
在这里插入图片描述
例子:set键
在这里插入图片描述

6.1.2.2 命令执行器(2):执行预备操作

cmd、argv、argc属性收集完毕,此时需要进行一些预备操作,确保命令可以正确、顺序地被执行(单机下):
在这里插入图片描述

6.1.2.3 命令执行器(3):调用命令

完成预备操作后,服务器决定要执行命令,则执行以下语句:
client->cmd->proc(client);//client是指向客户端状态的指针

例子:client->cmd->proc(client);相当于setCommand
在这里插入图片描述
产生的命令回复存储与客户端的输出缓冲区;实现函数会为客户端的socket关联命令回复处理器,负责将命令回复返回给客户端:
在这里插入图片描述

6.1.2.4 命令执行器(4):执行后续工作

在这里插入图片描述
此时,服务器对于当前命令的执行就结束,可以继续从文件事件处理器中取出并处理下一个命令请求

6.1.2 步骤3:将命令回复发送给客户端

命令回复会保存到客户端的输出缓冲区里面,并为客户端socket关联命令回复处理器;当客户端socket变为可写时,服务器就会执行命令回复处理器,将保存在客户端输出缓冲区的命令回复发送给客户端

6.1.2 步骤4:客户端接收并打印命令回复

流程:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值