• redis源码从main开始2中创建了监听当有新的tcp连接与redis服务端建立连接时, acceptTcpHandler会为该连接创建一个操作redis的客户端, 并且为该连接加上新的后续处理该链接请求的readQueryFromClient方法

// src/redis.c

void initServer()
{
    //......
    // 创建新连接的处理器 acceptTcpHandler
    aeCreateFileEvent(server.el, server.ipfd[j], AE_READABLE, acceptTcpHandler, NULL) == AE_ERR
    //......
}

// src/networking.c
/* 
 * 创建一个 TCP 连接处理器
 */
void acceptTcpHandler(aeEventLoop *el, int fd, void *privdata, int mask)
{
    // 接收新连接,获取新连接的编号
    cfd = anetTcpAccept(server.neterr, fd, cip, sizeof(cip), &cport);
    // 为新的编号创建操作redis的客户端
    acceptCommonHandler(cfd, 0);
}

static void acceptCommonHandler(int fd, int flags)
{

    // 创建客户端
    redisClient *c;
    (c = createClient(fd)) == NULL
}

/*
 * 创建一个新客户端
 */
redisClient *createClient(int fd)
{

    // 不等于-1为 创建有网络连接的客户端
    if (fd != -1)
    {
        // 将该连接的处理方法换成readQueryFromClient方法
        aeCreateFileEvent(server.el, fd, AE_READABLE, readQueryFromClient, c) == AE_ERR
    }

    // 一些设置属性....

    // 返回客户端
    return c;
}

/*
 * 当客户端有新的消息到达时,readQueryFromClient这里会处理请求
 */
void readQueryFromClient(aeEventLoop *el, int fd, void *privdata, int mask)
{

    processInputBuffer(c);
}

基于版本3.0.0版本,点击下载https://download.redis.io/releases/redis-3.0.0.tar.gz

本文地址,https://www.ccagml.com/?p=376

发表评论