- 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