今兒,我們來搭建一個 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核心技術與實戰》