Caution

未完待续

env version
redis 6.2.7

1 vscode debug 环境搭建

  1. 添加配置

mac 环境选择lldb, 然后修改部分配置,如下

launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(lldb) 启动",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/src/redis-server",
            "args": [
                "./redis.conf"
            ],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "lldb"
        }

    ]
}
  1. 编译
# 编译
# -O0 参数表示告诉编译器不要优化代码, 防止你在 Debug 的时候,IDE 里面的 Redis 源码与实际运行的代码对应不上.
# MALLOC=jemalloc,指定在 Mac OS 系统上 Redis 使用 jemalloc 内存分配器,
# Linux 默认使用该分配器,如果是 Linux 系统,无需指定该参数
make CFLAGS="-g -O0" MALLOC=jemalloc
  1. 开始调试 (快捷键F5)
src/server.c main()主函数 打个断点 
int main(int argc, char **argv) {
    struct timeval tv;
    int j;
    char config_from_stdin = 0;
    ...
    ...
}

2 总体流程

2.1 服务启动

Diagram
server.c
// 入口
int main(int argc, char **argv) {
    // ...
    initServerConfig();
    // ...
    initServer();
    // ...
}
struct redisCommand redisCommandTable[] = {
    {"module",moduleCommand,-2,
    "admin no-script",
    0,NULL,0,0,0,0,0,0},

    {"get",getCommand,2,
    "read-only fast @string",
    0,NULL,1,1,1,0,0,0},
    ...
}
void initServer(void) {
    // ...
    server.db = zmalloc(sizeof(redisDb)*server.dbnum);
    // ...
    
    /* 创建并初始化数据库结构 dbnum=16  我们select 0 选择数据库*/
    for (j = 0; j < server.dbnum; j++) {
        server.db[j].dict = dictCreate(&dbDictType,NULL);
        server.db[j].expires = dictCreate(&dbExpiresDictType,NULL);
        server.db[j].expires_cursor = 0;
        server.db[j].blocking_keys = dictCreate(&keylistDictType,NULL);
        server.db[j].ready_keys = dictCreate(&objectKeyPointerValueDictType,NULL);
        server.db[j].watched_keys = dictCreate(&keylistDictType,NULL);
        server.db[j].id = j;
        server.db[j].avg_ttl = 0;
        server.db[j].defrag_later = listCreate();
        listSetFreeMethod(server.db[j].defrag_later,(void (*)(void*))sdsfree);
    }

}

3 set age 11 的过程(doing)

typedef struct redisDb {
    /* The keyspace for this DB */
    dict *dict;                 
    /* Timeout of keys with a timeout set */
    dict *expires;           
    /* Keys with clients waiting for data (BLPOP)*/
    dict *blocking_keys;   
    /* Blocked keys that received a PUSH */
    dict *ready_keys;          
    /* WATCHED keys for MULTI/EXEC CAS */
    dict *watched_keys;         
    /* Database ID */
    int id;                     
    /* Average TTL, just for stats */
    long long avg_ttl;
    /* Cursor of the active expire cycle. */
    unsigned long expires_cursor; 
    /* List of key names to attempt to defrag one by one, gradually. */
    list *defrag_later;         
} redisDb;
Diagram
Back to top