1、準備工做
一、獲取代碼
fort redis倉庫 github.com/redis/redis 拉取代碼,切換到5.0分支,若是遇到github下載慢,能夠直接在頁面上切換5.0分支,而後把代碼壓縮包zip下載下來,但zip是不帶git信息的。html
二、環境準備
演示一下如何在 Mac + CLion 閱讀代碼,Redis 源碼編譯使用 Makefile 文件,Clion 是不支持 make 命令的,默認支持CMake,網上有不少教程是教怎麼寫 CMakeLists 文件,能夠參考這些教程:python
也有安裝python3 再安裝compiledb的方案:git
感受都有點繁瑣,難道Clion就不能支持Make項目啦,因而在官網找到了:github
大致意思是支持了但可能不太好,同時還提供了 Makefile support 插件,那我就給官方一個機會,使用 CLion 2020.3.2 版本試試。redis
三、Clion 編譯 Redis
1) 代碼跳轉插件 Makefile support
直接打開 redis 項目,打開 Makefile 文件,發現 CLion 和 IDEA 同樣只能,不認識的文件會有提示。算法
安裝插件,插件很小,安裝很快也不須要重啓 Clion。數據庫
2) 編譯
- 打開菜單欄 View -> Tool Windows -> Messages
- Build -> Rebuild Project
而後看到控制檯一頓編譯,很快生成了各類 *.o 文件服務器
3) Debug 運行程序
編輯程序啓動配置如圖,1和2兩處都選擇redis-servermarkdown
點擊 Debug 按鈕,見證奇蹟的時候到了。網絡
客戶端也能鏈接上,就是服務端怎麼也不打印日誌,可能 redis 沒什麼日誌。都說 redis 代碼寫的很優雅,咱也很久沒看過C代碼了,慢慢學吧。
3) Debug 代碼
想在代碼裏打個斷點調試下,好在南拳北圖略知一二,曾經據說過 String 結構的實現代碼在sds.c (Simple Dynamic String,簡單動態字符串)。
執行命令 set soul gateway
斷點起做用了,具體我也不看代碼了
Notes:要是出現 build 菜單下 build project 置灰沒法點擊的時候,關閉項目,找到 redis/Makefile 文件,右擊以 CLion 打開項目,發現能夠從新編譯了。
2、代碼
網上抄了一份 Redis4.0 的代碼閱讀清單,雖然想看5的,但變更不大。 github.com/tracenow/re… 本身的更感興趣的部分是:
- redis 做爲一個小而美的分佈式組件,它的高可用、高性能、高可擴展的取捨和代碼實現
- redis 的網絡怎麼實現,想學學C是如何去實現非阻塞網絡IO的
- 可能對於具體的數據結構沒那麼多興趣,明白數據結構原理和時間複雜度就好,不太關心怎麼實現
1、基礎數據結構
2、Redis數據類型
- 對象系統 object.c
- 字符串鍵 t_string.c
- 列表建 t_list.c
- 哈希鍵 t_hash.c
- 集合鍵 t_set.c
- 有序集合鍵 t_zset.c(除zsl開頭的全部函數)
- HyperLogLog鍵 hyperloglog.c(pf開頭的函數)
- 地理位置 geo.h、geo.c
3、Redis數據庫
- 數據庫實現 db.c
- 通知功能 notify.c
- RDB持久化 rdb.h、rdb.c
- AOF持久化 aof.c
4、客戶端/服務端
- 事件處理模塊 ae.h、ae.c、ae_epoll.c、ae_evport.c、ae_kqueue.c、ae_select.c
- 網路連接庫 anet.h、anet.c、networking.c
- 服務器端 server.h、server.c
- 客戶端 redis-cli.c
5、分佈式Redis
- 複製功能 replication.c
- Redis哨兵 sentinel.c
- Redis集羣 cluster.h、cluster.c
6、獨立功能模塊
- 發佈和訂閱 pubsub.c
- 事務 multi.c
7、測試
- 內存檢測 memtest.c
- redis性能測試 redis_benchmark.c
- 更新日誌檢查 redis_check_aof.c
- 本地數據庫檢查 redis_check_rdb.c
- C風格的小型測試框架 testhelp.c
8、工具類
- 二進制位操做命令 bitops.c
- 調試 debug.c
- 高低位轉換 endianconv.h、endianconv.c(適配不一樣系統)
- 輔助於命令的提示信息 help.h
- 壓縮算法 lzf.h、lzf_c.c、lzf_d.c、lzfP.h
- 隨機數 rand.h、rand.c
- 版本發佈 release.c
- sha加密算法 sha1.h、sha1.c
- 通用工具類 util.h、util.c
- 循環冗餘校驗 crc16.c、crc64.h、crc64.c
- SORT命令 sort.c
- 僞隨機函數 siphash.c
- 進程信息操做 setproctitle.c
- geo工具類 geohash_helper.h、geohash_helper.c
9、封裝類
- 後臺線程I/O bio.h、bio.c
- 延遲類 latency.h、latency.c
- 排序算法類 pqsort.h、pqsort.c
- Redis定義的I/O類 rio.h、rio.c
- 同步Socket和文件I/O操做 syncio.c
10、其餘
- 微線圖 sparkline.h、sparkline.c
- 慢日誌 slowlog.h、slowlog.c
- 腳本 scripting.c
- 過時機制 expire.c