在本系列中文章中,將會用 Go 建立一個與 Redis 相容的服務:這其中融合了我這幾年 Go 語言的經驗、技巧以及架構思考。
本系列適合對 Go 有一些基礎的朋友(有其它程式語言經驗的亦可,但可能會需要習慣一下 Go Style),希望我們在這個旅程中能收獲滿滿。
先從一個核心問題開始:如果在 SET 指令執行之後、AOF 寫入之前關閉服務,是否有可能造成資料遺失? --答案是肯定的。 我們雖然會在每次 SET 指令之後呼...
Dependency Injectino(依賴注入) 為了簡化初始化結構的設計模式。 在開始之前,我們先來檢視一下目前的 main.NewApp() // fi...
目前,我們用下列的結構來儲存資料: // file: ./inernal/repo/storage.go type mapStorage struct { s...
我們在昨天已經實現了對過期資料的被動刪除:當存取資料時,如果發現資料已過期就刪除它。 實作主動刪除功能?Redis 的做法是會建立一個執行緒,並且每 100 毫...
在某些參數下,SET 這個 Redis 指令會需要當前已經儲存的值: NX:只有當 Redis 中不存在該 Key 時才會設置成功 XX:只有當 Redi...
Go 提供了性能剖析工具 pprof,這是個在遇到性能瓶頸時非常有用的開發者工具。 pprof 有兩種形式: 在程式碼中使用 pprof.StartCPUPr...
在執行 redis-benchmark 時,如果不指定 -r 參數的話,它會請求相同的 key,在我們的設計中它會被互斥鎖擋住而降低吞吐量。 註:按照目前的設...
在經過 Day 26 與 Day 27 之後,我們可以得到如下的火焰圖: 可以見到 runtime.gcDrain 佔用了 25.14 秒(約 13.9%)的...
共享緩衝 絕大多數的 resp.(BulkString) 都很短,但我們卻在讀取時用 buf := make([]byte, sz),這其實相當浪費。 // f...