code-learning/redis/01-Redis 源码分析-调试环境搭建(Redis 6.X 版本).md

131 lines
7.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 精尽 Redis 源码分析 —— 调试环境搭建Redis 6.X 版本)
> 艿艿是 MacOS 胖友如果是 Windows 的话,可以参考本文,略作修改。
今儿,我们来搭建一个 Redis 调试环境,目标是:
- 启动 Redis Server ,成功断点调试 Server 的启动过程。
- 使用 `redis-cli` 启动一个 Client 连接上 Server并使用 `get key` 指令,发起一次 key 的读取。
视频可见 B 站https://www.bilibili.com/video/BV12X4y1c79z
😝 艿艿比较腼腆,大家给个三连支持一下,感恩 1024~
# 1. 依赖工具
## 1.1 CLion
下载地址https://www.jetbrains.com/clion
CLion 是 Jetbrains 团队提供的 C/C++ 开发工具。所以,所以和我们平时使用的 [IDEA](https://www.iocoder.cn/IDEA/idea-2020-reset-eval/) 差别不大。
这里,艿艿使用的是 CLion 版本是 **2021.1.3**
## ~~1.2 CMake~~
从 CLion [2020.2](https://blog.jetbrains.com/zh-hans/2020/07/08/clion-makefile/) 版本开始,可以支持 Makefile 类型的项目,而 Redis 就是使用 Makefile 构建的项目,所以我们**无需**再安装 CMake 啦!!!
可能胖友对 Makefile 或是 CMake 不太了解?!没关系,这个小节主要是给,之前尝试搭建 Redis 调试环境,结果被 CMake 的胖友。
**不影响后续的内容的学习**
# 2. 源码拉取
使用 CLion 从官方仓库 https://github.com/antirez/redis 克隆项目。操作如下图所示:
> 友情提示:如果网络不是很好的胖友,可以选择和艿艿一样,使用 Gitee 提供的镜像仓库 https://gitee.com/mirrors/redis.git
[![克隆 Redis 仓库](https://www.iocoder.cn/images/Redis/2019_09_20/redis-clone.gif)](https://www.iocoder.cn/images/Redis/2019_09_20/redis-clone.gif)克隆 Redis 仓库
这里,我们使用的 Redis 版本是 **6.2.5**
> 友情提示:胖友可以考虑 Fork 下[官方仓库](https://github.com/antirez/redis),为什么呢?
>
> 既然开始阅读、调试源码,我们可能会写一些注释,有了自己的仓库,可以进行自由的提交。😜
# 3. 导入项目
克隆完项目后CLion 会进行 Importing 导入项目,耐心等待一下。如下图所示:
[![导入项目](https://www.iocoder.cn/images/Redis/2019_09_20/redis-importing.png)](https://www.iocoder.cn/images/Redis/2019_09_20/redis-importing.png)导入项目
# 4. 编译项目
导入完成后,打开 Makefile 文件,点击 `default:all` 绿色箭头,开始项目的编译。如下图所示:
[![编译项目](https://www.iocoder.cn/images/Redis/2019_09_20/redis-build.png)](https://www.iocoder.cn/images/Redis/2019_09_20/redis-build.png)编译项目
# 5. 运行 Redis Server
① 配置 Redis Server 的启动项,操作如下图所示:
[![配置 Redis Server 启动项](https://www.iocoder.cn/images/Redis/2019_09_20/redis-server.png)](https://www.iocoder.cn/images/Redis/2019_09_20/redis-server.png)配置 Redis Server 启动项
[![配置 Redis Server 启动项](https://www.iocoder.cn/images/Redis/2019_09_20/redis-server2.png)](https://www.iocoder.cn/images/Redis/2019_09_20/redis-server2.png)配置 Redis Server 启动项
② 打开 `server.c` 文件,在 `#main(...)` 方法上,添加一个**方法断点**,它是 Redis Server 的启动入口。如下图所示:
[![设置 Redis Server main 断点](https://www.iocoder.cn/images/Redis/2019_09_20/redis-server-main.png)](https://www.iocoder.cn/images/Redis/2019_09_20/redis-server-main.png)设置 Redis Server main 断点
**Debug** 右上方的 redis-server 启动项,成功进入 `#main(...)` 方法的断点。如下图所示:
[![进入 Redis Server main 断点](https://www.iocoder.cn/images/Redis/2019_09_20/redis-server-main2.png)](https://www.iocoder.cn/images/Redis/2019_09_20/redis-server-main2.png)进入 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
```
# 6. 运行 Redis Client
① 打开 `ae.c` 文件,在 `#aeProcessEvents(...)` 方法的如图处,打上一个**端点**,用于调试 Redis Server 处理各种来自 Redis Client 的 IO 事件。如下图所示:
[![设置 Redis Server ae 断点](https://www.iocoder.cn/images/Redis/2019_09_20/redis-server-ae.png)](https://www.iocoder.cn/images/Redis/2019_09_20/redis-server-ae.png)设置 Redis Server ae 断点
② 打开 IDE Terminal运行 `redis-cli` 启动一个 Redis Client连接上 Redis Server。如下图所示
[![启动 Redis Client](https://www.iocoder.cn/images/Redis/2019_09_20/redis-cli.png)](https://www.iocoder.cn/images/Redis/2019_09_20/redis-cli.png)启动 Redis Client
此时,我们在 `ae.c``#aeProcessEvents(...)` 的断点成功进入Redis Server 收到 Redis Client 的**连接事件**。
打开 Debug 窗口,点击左下方的**绿色**小箭头,恢复 Redis Server 的执行。
③ 回到 `redis-cli` 命令行,输入 `get key` 指令,向 Redis Server 发起一次 `get` 请求。效果如下图所示:
[![Redis Client 读取 key](https://www.iocoder.cn/images/Redis/2019_09_20/redis-cli-get-key.png)](https://www.iocoder.cn/images/Redis/2019_09_20/redis-cli-get-key.png)Redis Client 读取 key
此时,我们在 `ae.c``#aeProcessEvents(...)` 的断点又一次进入Redis Server 收到 Redis Client 的 `get` 请求。
------
至此,我们已经完成了我们的第二个小目标“*使用 `redis-cli` 启动一个 Client 连接上 Server并使用 `get key` 指令,发起一次 key 的读取*”。
# 7. 源码解析
Redis 源码是使用 C 实现的,对于 Java 程序员的我们来说,还是有一定“门槛”的,所以最好借助下市面上 Redis 相关的书籍。
① [《Redis 设计与实现》](https://github.com/YunaiV/books),针对 Redis 3.X 版本,豆瓣评分 8.6 分,对应详细注释的 Redis 仓库 https://github.com/YunaiV/redis-3.0-annotated.git 。
这本书艿艿和蛮多朋友都看过,虽然针对的 Redis 版本比较老,考虑到 Redis 核心代码变动其实不多,还是非常不错的选择。
② [《Redis5设计与源码分析》](https://github.com/YunaiV/books),针对 Redis 5.X 版本,豆瓣评分 6.8 分。
主要优点是针对 Redis 5.X 版本,比较新。具体内容如何,艿艿也不是很确定。可以备一本,在看到源码卡壳的时候,作为字典查一查,也是不错的选择哈~
③ [《Redis源码剖析与实战》](https://static001.geekbang.org/misc/posters/1044546/184d59981e2b62d539ae6e4732a8badb.jpg),针对 Redis 版本不详,极客时间 2021 年出的,可能是 Redis 6.X 版本。
这个专栏,目前还在更新,艿艿准备养肥之后,花 1-2 周撸一撸,嘿嘿!作者(蒋德钧)之前出的[《Redis核心技术与实战》](https://static001.geekbang.org/misc/posters/1044546/bc2c20a873b8d016029fb615f96fcd1e.jpg) 非常不错,我大飞哥好评连连!
------
**END~**
我是艿艿,一个正在某厂做 Web IDE 的死胖子,干掉本地 IDEA 和 VSCode
欢迎添加我的微信号 **naiziguo**,一起网上冲浪 🌊 …