Caution
未完待续
| env | version |
|---|---|
| redis | 6.2.7 |
1 vscode debug 环境搭建
- 添加配置

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"
}
]
}- 编译
# 编译
# -O0 参数表示告诉编译器不要优化代码, 防止你在 Debug 的时候,IDE 里面的 Redis 源码与实际运行的代码对应不上.
# MALLOC=jemalloc,指定在 Mac OS 系统上 Redis 使用 jemalloc 内存分配器,
# Linux 默认使用该分配器,如果是 Linux 系统,无需指定该参数
make CFLAGS="-g -O0" MALLOC=jemalloc- 开始调试 (快捷键F5)
2 总体流程
2.1 服务启动
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;