iT邦幫忙

鐵人檔案

2026 iThome 鐵人賽
回列表
Software Development

手刻 Redis:用 Go 從零打造高效能高併發的記憶體資料庫 系列

本系列將以 Go 語言從零手寫一個相容 Redis RESP 協定的高併發記憶體資料庫,不只學會「用」Redis,更深入其底層運作。30 天內逐步完成:RESP 協定解析器、高併發 TCP 伺服器、String/List/Hash/Set/Sorted Set 五大資料結構(含手寫跳躍表)、TTL 過期與記憶體淘汰(LRU/LFU)、AOF/RDB 持久化、主從複製,以及事務、Pub/Sub、Pipeline 等進階機制,最後以 redis-benchmark 與 pprof 進行效能驗證。適合想深入資料庫底層與網路程式設計的開發者。

參賽天數 25 天 | 共 25 篇文章 | 2 人訂閱 訂閱系列文 RSS系列文
DAY 1

Day 01:Redis Clone 專案規劃與 Go 開發環境初始化

為什麼要自己寫一個 Redis? Redis 很多人都用過,拿來做快取、工作佇列、分散式鎖都很順手。但我一直覺得只停在「會用」有點可惜,尤其是它背後的網路 I/...

2026-08-18 ‧ 由 tim1101 分享
DAY 2

Day 02:實作高併發 TCP Socket 伺服器與 Graceful Shutdown

寫資料庫引擎之前,網路層得先站穩。Redis 之所以快,底層事件模型佔了很大一部分;我雖然不用在 Go 裡手刻 epoll,但還是得先做出一個可以同時處理多個...

2026-08-19 ‧ 由 tim1101 分享
DAY 3

Day 03:RESP 協定介紹與 Parser 基礎架構設計

要自己刻 Redis,第一步當然是要讓 Server 聽得懂 Client 在講什麼。Redis 客戶端與伺服器之間進行通訊時,使用的是一種名為 RESP (R...

2026-08-20 ‧ 由 tim1101 分享
DAY 4

Day 04:實作 RESP Parser - 解析 Simple Strings, Errors 與 Integers

昨天把 Parser 的骨架搭好了,今天就直接來寫解析邏輯吧。 我先挑比較軟的柿子吃,從 RESP 裡三種單行資料型態開始:Simple Strings (簡單...

2026-08-21 ‧ 由 tim1101 分享
DAY 5

Day 05:實作 RESP Parser - 解析 Bulk Strings 與 Arrays,完成基礎的 Parser 單元測試

昨天把單行解析補完後,今天換處理 RESP 裡比較容易寫錯的兩個型別:Bulk Strings (二進位安全字串) 與 Arrays (陣列)。這兩個一個要處理...

2026-08-22 ‧ 由 tim1101 分享
DAY 6

Day 06:設計與實作thread-safe 的記憶體儲存引擎

網路和 Parser 搞定後,今天終於要進到重頭戲:記憶體資料庫引擎。 今天先把 Thread-safe 的記憶體儲存引擎做出來,讓後面的命令有地方可以真的讀寫...

2026-08-23 ‧ 由 tim1101 分享
DAY 7

Day 07:實作記憶體引擎基礎命令:SET, GET, DEL 與 EXISTS

引擎骨架弄好後,今天直接來實作最基本的 String 操作:SET、GET、DEL 和 EXISTS。 基礎命令的設計與實作 我在 code/db/db.go...

2026-08-24 ‧ 由 tim1101 分享
DAY 8

Day 08:過期時間(TTL)與惰性刪除機制深度解析

用過 Redis 的人都知道 EXPIRE 很好用,時間一到資料就不見了。這在快取、驗證碼與臨時鎖等場景中是很重要的特性。 今天就來把 TTL 和惰性刪除(La...

2026-08-25 ‧ 由 tim1101 分享
DAY 9

Day 09:實作核心資料結構 List 與雙端操作命令

Redis 的 List 很常拿來做 Message Queue,或是處理需要從頭尾推資料的場景。它本質上是一串二進位安全字串。 今天來做 List,先補最常用...

2026-08-26 ‧ 由 tim1101 分享
DAY 10

Day 10:實作核心資料結構 Hash 與欄位操作命令

Redis 的 Hash 很適合存物件資料,不用每次都把整包 JSON 存進去;只改某個欄位時,直接動那個 field 就好。它其實就是 field 到 val...

2026-08-27 ‧ 由 tim1101 分享