看了黃建巨集老師的《Redis設計與實現》,對redis的部分實現有了一個簡明的認識; 之前面試的時候被問到了這部分的內容,沒有關註,好在還有時間,就把Redis的源碼看了一遍。 Redis源碼的獲取 Redis是完全開源的,其源代碼可以在直接在GitHub上獲取:https://github.com ...
看了黃建巨集老師的《Redis設計與實現》,對redis的部分實現有了一個簡明的認識;
之前面試的時候被問到了這部分的內容,沒有關註,好在還有時間,就把Redis的源碼看了一遍。
Redis源碼的獲取
Redis是完全開源的,其源代碼可以在直接在GitHub上獲取:https://github.com/antirez/redis(目前的版本是4.4.0)
此時,進入解壓後的redis目錄下的src文件夾,redis的所有源代碼都存放在此。
源代碼結構解析
從redis源碼解析看到的redis源碼閱讀方法,我覺得這適用於很多源碼的閱讀:
- 自底向上:從耦合關係最小的模塊開始讀,然後逐漸過度到關係緊密的模塊。就好像寫程式的測試一樣,先從單元測試開始,然後才到功能測試。
- 從功能入手:通過文件名(模塊名)和函數名,快速定位到一個功能的具體實現,然後追蹤整個實現的運作流程,從而瞭解該功能的實現方式。
- 自頂向下:從程式的 main() 函數,或者某個特別大的調用者函數為入口,以深度優先或者廣度優先的方式閱讀它的源碼。
Redis的數據結構部分
記憶體分配 | zmalloc.c和zmalloc.h |
動態字元串 | sds.h和sds.c |
雙端鏈表 | adlist.c和adlist.h |
字典 | dict.h和dict.c |
跳躍表 | server.h文件裡面關於zskiplist結構和zskiplistNode結構,以及t_zset.c中所有zsl開頭的函數 |
Redis的記憶體編碼
整數集合 | intset.h和intset.c |
壓縮列表 | ziplist.h和ziplist.c |
壓縮表 | zipmap.h和zipmap.c |
Redis數據類型
對象 | object.c |
字元串對象 | t_string.c |
列表對象 | t_list.c |
散列對象 | t_hash.c |
集合對象 | t_set.c |
有序集合對象 | t_zset.c中除 zsl 開頭的函數之外的所有函數 |
Redis資料庫的實現
資料庫實現 | db.c |
RDB持久化 | rdb.c |
AOF持久化 | aof.c |
通知功能 | notify.c |
客戶端和伺服器端的代碼實現
伺服器端 | redis.c |
客戶端 | redis-cli.c |
事件處理 | ae.c/ae_epoll.c/ae_evport.c/ae_kqueue.c/ae_select.c |
網路鏈接 | anet.c和networking.c |
Redis多機部分的代碼實現
複製功能 | replication.c |
Redis Sentinel | sentinel.c |
集群 | cluster.c |
獨立功能模塊的實現
發佈和訂閱 | pubsub.c文件 |
事務 | multi.c |
lua腳本 | scripting.c |
慢查詢 | slowlog.c |
監視 | monitor.c |
整個Redis的源碼分類大體上如上所述了。