对输入的命令做响应处理
issueCommandRepeat
while (1)
{
客户端发送命令
cliSendCommand
对输入的命令做处理,格式化命令,构造成符合redis通信协议格式,并写到发送缓冲区,然后阻塞等待服务端响应返回数据
redisAppendCommandArgv
对所有的命令进行格式化处理,将字符串转换为符合 RESP 协议的数据
redisFormatSdsCommandArgv
把符合通信协议的命令字符串写到发送缓冲区
__redisAppendCommand
写命令到发送缓冲区至此命令发送完毕。接下来阻塞等待服务端返回数据
c->obuf = newbuf
客户端读取响应
cliReadReply
//把发送缓冲区的命令发送出去,并等待服务端返回
redisGetReply
尝试读取已有的回复,为了不影响接下来发送命令后的真正响应数据
redisGetReplyFromReader
redisReaderGetReply
//把之前写入到发送缓冲区的命令写给socket,发送给服务端
redisBufferWrite
//写数据到socket,通过网络发送给服务端
write(c->fd,c->obuf,sdslen(c->obuf))
//一直等待直至服务端回复,并推给回复包解析器
redisBufferRead
//从socket读取数据
read(c->fd,buf,sizeof(buf))
//把数据推给解析器
redisReaderFeed
//检查是否需要连接到其他节点并重新发出请求(集群模式转发MOVED,读取服务端失败ASK)
!strncmp(reply->str,"MOVED",5) || !strcmp(reply->str,"ASK")
//根据选主方式格式化回复
cliFormatReplyRaw、cliFormatReplyTTY、cliFormatReplyCSV
}