通過閱讀 Redis 源碼,可以學習和掌握到的計算機系統設計思想
根據 Redis 不同的功能特性,分線條學習每個功能特性上涉及的關鍵技術和設計思想
對於Redis的代碼架構,需要掌握以下兩類內容
-
代碼的目錄結構和作用划分,目的是理解 Redis 代碼的整體架構,以及所包含的代碼功能類別;
-
系統功能模塊與對應代碼文件,目的是了解 Redis 實例提供的各項功能及其相應的實現文件,以便后續深入學習。
對於閱讀 Redis 源碼來說,要先從整體上掌握源碼的結構,所以需要先形成一幅 Redis 源碼的全景圖(基於 Redis 5.0.8 版本)
-
deps 目錄
這個目錄主要包含了 Redis 依賴的第三方代碼庫,包括 Redis 的 C 語言版本客戶端代碼 hiredis、jemalloc 內存分配器代碼(用來替換 glibc 庫的內存分配器)、readline 功能的替代代碼 linenoise,以及 lua 腳本代碼。這部分代碼的一個顯著特點,就是它們可以獨立於 Redis src 目錄下的功能源碼進行編譯,也就是說,它們可以獨立於 Redis 存在和發展。
-
src 目錄
這個目錄里面包含了 Redis 所有功能模塊的代碼文件,也是 Redis 源碼的重要組成部分。src 目錄下只有一個 modules 子目錄,其中包含了一個實現 Redis module 的示例代碼。剩余的源碼文件都是在 src 目錄下。
-
tests 目錄
這個目錄里面是用於功能模塊測試和單元測試的代碼。Redis 實現的測試代碼可以分成四部分,分別是單元測試(對應 unit 子目錄),Redis Cluster 功能測試(對應 cluster 子目錄)、哨兵功能測試(對應 sentinel 子目錄)、主從復制功能測試(對應 integration 子目錄)。這些子目錄中的測試代碼使用了 Tcl 語言(通用的腳本語言)進行編寫,主要目的就是方便進行測試。
-
utils 目錄
這個目錄里面是在 Redis 開發過程中的一些輔助性功能,包括用於創建 Redis Cluster 的腳本、用於測試 LRU 算法效果的程序,以及可視化 rehash 過程的程序。
代碼分類(忽略.h頭文件)
數據類型:
- String(t_string.c、sds.c、bitops.c)
- List(t_list.c、ziplist.c、quicklist.c)
- Hash(t_hash.c、ziplist.c、dict.c)
- Set(t_set.c、intset.c)
- Sorted Set(t_zset.c、ziplist.c、dict.c)
- HyperLogLog(hyperloglog.c)
- Geo(geo.c、geohash.c、geohash_helper.c)
- Stream(t_stream.c、rax.c、listpack.c)
全局:
- Server(
server.c-->main入口
、anet.c) - Object(object.c)
- 鍵值對(db.c)
- 事件驅動(ae.c、ae_epoll.c、ae_kqueue.c、ae_evport.c、ae_select.c、networking.c)
- 內存回收(expire.c、lazyfree.c)
- 數據替換(evict.c)
- 后台線程(bio.c)
- 事務(multi.c)
- PubSub(pubsub.c)
- 內存分配(zmalloc.c)
- 雙向鏈表(adlist.c)
高可用&集群:
- 持久化:RDB(rdb.c、redis-check-rdb.c)、AOF(aof.c、redis-check-aof.c)
- 主從復制(replication.c)
- 哨兵(sentinel.c)
- 集群(cluster.c)
輔助功能:
- 延遲統計(latency.c)
- 慢日志(slowlog.c)
- 通知(notify.c)
- 基准性能(redis-benchmark.c)