1.Redis实例启动的时候,创建TcpHandler来处理客户端的请求
(redis.c)
|
|
其中acceptTcpHandler就是处理TCP连接的函数。
2.networking.c中包含了acceptTcpHandler的详细定义,其中acceptCommonHandler是accpet后的处理逻辑
|
|
3.networking.c中包含了acceptCommonHandler的详细定义,其中createClient用来创建客户端连接结构体。
|
|
4.networking.c中包含了createClient的详细定义,其中readQueryFromClient就是处理客户端输入数据
|
|
5.networking.c中包含了readQueryFromClient的详细定义,其中processInputBuffer就是解析和处理数据
|
|
6.networking.c中包含了processInputBuffer的详细定义,其中:
processInlineBuffer是验证单行命令。
processMultibulkBuffer是验证多行命令。
processCommand是命令处理,也就是我们需要关心和跟踪的。
|
|
7.redis.c中包含了processCommand的详细定义,其中:call(c,REDIS_CALL_FULL)是普通命令的调用逻辑
|
|
8.redis.c中包含了call的定义,其中c-cmd->proc是命令的真正执行逻辑,显然redisClient中包含了cmd属性,cmd有proc方法。
|
|
9.redis.h中包含了redisClient的定义,redisCommand cmd就是那个cmd
|
|
10. redis.h包含redisCmd的定义,其中包含redisCommandProc
|
|
11.redis.c中包含:在初始化时候会加载所有命令,就是RedisCommand数组,其中第二个参数就是redisCommandProc,也就是各个命令的处理逻辑
|
|
其中server.commands就是命令字典
|
|
Redis在启动的时候会生成这个字典:
|
|
下面的方法用于从字典中获取命令
|
|
proccessCommand包含了命令寻找的逻辑
|
|
12.以getCommand为例子,它在t_string.c中。
getCommand会调用getGenericCommand,getGenericCommand会从数据库(db.c)中查询对应的值。
|
|
13. db.c是数据库的处理逻辑,Redis默认有16个数据库(cluster只有一个),定义如下:
|
|
|
|
其中包含了key-value字典、expires字典等,存储所有的数据。