redis客户端与服务端通信流程

客户端与服务端通信流程(客户端角度)

Posted by Liangjf on March 30, 2020

redis客户端与服务端通信流程(客户端角度)

流程图

调用栈

对输入的命令做响应处理
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
    }