1.发送命令
当我们在客户端输入命令时,客户端会将命令转换协议格式
2.读取命令
服务器收到后,将命令请求保存到客户端状态的输入缓冲区,客户端状态是保存状态信息的,比如客户端连接时间、是否授权、输入缓存区等等。
完成输入后,对输入缓存区进行分析,保存到客户端状态的argv、argc属性当中,其实就是把输入缓存区进行词法分析。
3.查找命令
客户端状态argv是数组,argv[0]保存的是redis的命令,如set。服务器根据set去命令表当中找到set所指向的函数。命令表的结构就是key 是命令 value是该命令指向的函数、命令有多少参数等修饰这个命令的信息。
4.执行预备操作
进行各种检查,如
1.上一步找到命令指向的函数是不是为null,
2.参数的个数对不对
3.客户端是不是通过了身份验证,其实就是检查一个客户端状态中某个值
等等
5.调用命令的实现函数
调用函数,将函数的返回值放到客户端状态的buf中
6.执行后续工作
1.如果开启慢查询,根据执行的时间来判断是否要写入
2.更新客户端状态信息,如最后一次命令执行的时间,执行命令数量等
3.如果开启了AOF,就写入AOF缓存区
7.命令发送给客户端
前面已经把回复放到客户端的输出缓冲区了,并为客户端套接字关联命令回复处理器。
但客户端的套接字变为可写状态时,命令处理器就会发送命令。
这里说一下,什么套接字变为可写状态。客户端准备好要读取时,就会把套接字变成可写状态,服务器把内容写入套接字,客户端就能读取到。我们可以把套接字理解为文件。
8.客户端接收
客户端把接收到的内容转换格式