今儿,我们来搭建一个 Redis 调试环境,目标是:
- 启动 Redis Server ,成功断点调试 Server 的启动过程。
- 使用
redis-cli
启动一个 Client 连接上 Server,并使用get key
指令,发起一次 key 的读取。
视频可见 B 站:https://www.bilibili.com/video/BV12X4y1c79z
依赖工具
CLion
下载地址:https://www.jetbrains.com/clion
CLion 是 Jetbrains 团队提供的 C/C++ 开发工具。所以,所以和我们平时使用的 IDEA 差别不大。
这里使用的是 CLion 版本是 2021.1.3 。
源码拉取
使用 CLion 从官方仓库 https://github.com/antirez/redis 克隆项目。操作如下图所示:
gitee
这里,我们使用的 Redis 版本是 6.2.5。
导入项目
克隆完项目后,CLion 会进行 Importing 导入项目,耐心等待一下。如下图所示:
编译项目
导入完成后,打开 Makefile 文件,点击 default:all
绿色箭头,开始项目的编译。如下图所示:
运行 Redis Server
① 配置 Redis Server 的启动项,操作如下图所示:
② 打开server.c
文件,在 #main(...)
方法上,添加一个方法断点,它是 Redis Server 的启动入口。如下图所示:
③ Debug 右上方的 redis-server 启动项,成功进入 #main(…) 方法的断点。如下图所示:
至此,我们已经完成了我们的第一个小目标“启动 Redis Server ,成功断点调试 Server 的启动过程”。
点击左下方的绿色小箭头,恢复 Redis Server 的启动,不然等会 Redis Client 都连接不上来。在 CLion 的控制台,我们会看到 Redis Server 启动成功的日志如下:
22315:M 28 Jul 2021 01:23:37.535 # Server initialized
22315:M 28 Jul 2021 01:23:37.535 * Ready to accept connections
运行 Redis Client
① 打开 ae.c
文件,在 #aeProcessEvents(...)
方法的如图处,打上一个端点,用于调试 Redis Server 处理各种来自 Redis Client 的 IO 事件。如下图所示:
② 打开 IDE Terminal,运行 redis-cli 启动一个 Redis Client,连接上 Redis Server。如下图所示:
此时,我们在 ae.c
的#aeProcessEvents(...)
的断点成功进入,Redis Server 收到 Redis Client 的连接事件。
打开 Debug 窗口,点击左下方的绿色小箭头,恢复 Redis Server 的执行。
③ 回到redis-cli
命令行,输入 get key
指令,向 Redis Server 发起一次 get
请求。效果如下图所示:
此时,我们在 ae.c
的 #aeProcessEvents(...)
的断点又一次进入,Redis Server 收到 Redis Client 的 get
请求。
至此,我们已经完成了我们的第二个小目标“使用 redis-cli 启动一个 Client 连接上 Server,并使用 get key 指令,发起一次 key 的读取”。
源码解析
Redis 源码是使用 C 实现的,对于 Java 程序员的我们来说,还是有一定“门槛”的,所以最好借助下市面上 Redis 相关的书籍。
① 《Redis 设计与实现》,针对 Redis 3.X 版本,豆瓣评分 8.6 分,对应详细注释的 Redis 仓库 链接: https://pan.baidu.com/s/1I-TtD22NRnBZiKBIURYr7w 提取码: wfdm
② 《Redis5设计与源码分析》,针对 Redis 5.X 版本,豆瓣评分 6.8 分。
链接: https://pan.baidu.com/s/1y3Kjwi70h2PiHoIctmBJgw 提取码: stah
③ 《Redis源码剖析与实战》,针对 Redis 版本不详,极客时间 2021 年出的,可能是 Redis 6.X 版本。
④ 《Redis核心技术与实战》