redis命令请求执行过程🥈
查找命令
命令执行器根据客户端状态的argv[0]参数,在命令表中查找参数所指定的命令,将找到的命令保存到客户端状态的cmd属性中
命令表是一个字典,字典的键是命令名字,值是redisCommand,每个redisCommand结构记录reids命令的实现信息
执行预备操作
redis将执行命令所需的命令实现函数、参数、参数个数收集齐后,在真正执行命令之前,程序要需要检查客户端状态的cmd指针是否指向null,如果是说明用户输入的命令名字找不到相应的命令实现,服务器不再执行后续步骤,并向客户端返回一个错误。根据客户端cmd属性指向的RedisCommand结构的arity属性,检查命令请求给定的参数个数是否正确。然后检查客户端是否通过身份验证。
如果服务器打开了maxmemory功能,检查服务器的内存占用情况,在有需要时进行内存回收♻️
调用命令的实现函数
执行后续工作
执行完实现函数后,如果开启了慢查询日志功能,那么检查是否为刚刚执行的命令请求添加到慢查询日志中
如果开启AOF持久化,AOF持久化模块将刚刚执行的命令请求写入到AOF缓冲区中
如果其他从服务器正在复制当前服务器,服务器将刚刚执行的命令传播给所有从服务器
这样服务器可以继续从文件事件处理器中取出下一个命令进行处理了
然后命令实现函数将命令回复保存到客户端的输出缓冲区里面,为客户端套接字关联命令回复处理器,当客户端套接字变为可写状态时,服务器会执行命令回复处理器,将保存在客户端输出缓冲区中的命令回复发送给客户端。
当命令回复发送完毕后,回复处理器清空客户端状态的输出缓冲区,为处理下一个命令请求做准备
当客户端接收到协议格式的命令回复后,客户端将这些回复转为可读的格式,并打印给用户观看。