iT邦幫忙

鐵人檔案

2026 iThome 鐵人賽
回列表
Software Development

從零開始打造 Redis:以 Go 建立 Production Ready 應用程式 系列

在本系列中文章中,將會用 Go 建立一個與 Redis 相容的服務:這其中融合了我這幾年 Go 語言的經驗、技巧以及架構思考。

本系列適合對 Go 有一些基礎的朋友(有其它程式語言經驗的亦可,但可能會需要習慣一下 Go Style),希望我們在這個旅程中能收獲滿滿。

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

[Day 21] 再論 AOF

先從一個核心問題開始:如果在 SET 指令執行之後、AOF 寫入之前關閉服務,是否有可能造成資料遺失? --答案是肯定的。 我們雖然會在每次 SET 指令之後呼...

2026-08-30 ‧ 由 芥龍 分享
DAY 14

[Day 22] 依賴注入

Dependency Injectino(依賴注入) 為了簡化初始化結構的設計模式。 在開始之前,我們先來檢視一下目前的 main.NewApp() // fi...

2026-08-30 ‧ 由 芥龍 分享
DAY 14

[Day 23] 過期處理(上):資料結構與被動刪除

目前,我們用下列的結構來儲存資料: // file: ./inernal/repo/storage.go type mapStorage struct { s...

2026-08-30 ‧ 由 芥龍 分享
DAY 14

[Day 24] 過期處理(下):主動刪除與 AOF 處理

我們在昨天已經實現了對過期資料的被動刪除:當存取資料時,如果發現資料已過期就刪除它。 實作主動刪除功能?Redis 的做法是會建立一個執行緒,並且每 100 毫...

2026-08-30 ‧ 由 芥龍 分享
DAY 14

[Day 25] 當 SET 需要當前資料

在某些參數下,SET 這個 Redis 指令會需要當前已經儲存的值: NX:只有當 Redis 中不存在該 Key 時才會設置成功 XX:只有當 Redi...

2026-08-30 ‧ 由 芥龍 分享
DAY 14

[Day 26] 用 pprof 進行性能剖析

Go 提供了性能剖析工具 pprof,這是個在遇到性能瓶頸時非常有用的開發者工具。 pprof 有兩種形式: 在程式碼中使用 pprof.StartCPUPr...

2026-08-30 ‧ 由 芥龍 分享
DAY 14

[Day 27] 對互斥鎖的性能剖析

在執行 redis-benchmark 時,如果不指定 -r 參數的話,它會請求相同的 key,在我們的設計中它會被互斥鎖擋住而降低吞吐量。 註:按照目前的設...

2026-08-30 ‧ 由 芥龍 分享
DAY 14

[Day 28] 對記憶體性能進行剖析(上)

在經過 Day 26 與 Day 27 之後,我們可以得到如下的火焰圖: 可以見到 runtime.gcDrain 佔用了 25.14 秒(約 13.9%)的...

2026-08-30 ‧ 由 芥龍 分享
DAY 14

[Day 29] 對記憶體進行性能剖析(下)

共享緩衝 絕大多數的 resp.(BulkString) 都很短,但我們卻在讀取時用 buf := make([]byte, sz),這其實相當浪費。 // f...

2026-08-30 ‧ 由 芥龍 分享