redis 使用addReply系列函数发送查询结果以及错误信息给客户端。这一篇我们来研究redis是如何组织并发送这些消息的。

当网络连接准备好之后redis就会开始等待接收网络数据并处理。

还记得我们在分析createClient这个函数的时候,当conn不为空时的处理吗?

1    if (conn) {
2        connNonBlock(conn);
3        connEnableTcpNoDelay(conn);
4        if (server.tcpkeepalive)
5            connKeepAlive(conn,server.tcpkeepalive);
6        connSetReadHandler(conn, readQueryFromClient);
7...

处理连接请求

还记的我们在讲服务器启动的时候在initServer里面为socket设置Accept事件处理函数的地方吗?

 1    /* Create an event handler for accepting new connections in TCP and Unix
 2     * domain sockets. */
 3    if (createSocketAcceptHandler(&server.ipfd, acceptTcpHandler) != C_OK) {
 4        serverPanic("Unrecoverable error creating TCP socket...

Redis 监听端口

还记得上一篇我们讲的 initServer() 中网络监听的调用吗?

 1    /* Open the TCP listening socket for the user commands. */
 2    if (server.port != 0 &&
 3        listenToPort(server.port,&server.ipfd) == C_ERR) {
 4        serverLog(LL_WARNING, "Failed listening on port %u (TCP), aborting.", server.port);
 5...