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:客户端接收并打印命令回复
流程: