在本系列中文章中,將會用 Go 建立一個與 Redis 相容的服務:這其中融合了我這幾年 Go 語言的經驗、技巧以及架構思考。
本系列適合對 Go 有一些基礎的朋友(有其它程式語言經驗的亦可,但可能會需要習慣一下 Go Style),希望我們在這個旅程中能收獲滿滿。
在實作 Redis 指令之前,我們可以預先構想一下這些指令應該怎麼被處理。 工廠模式 是一個重要的設計模式之一,它讓開發者能夠專注在單一功能的實作上(以這個專案...
灌水了 11 天的文,我們終於可以進到整個 Redis 最核心的功能:鍵值存儲。 資料儲存 在實際設計 GET 與 SET 時,我們應該要先決定資料如何被儲存。...
Redis 作為一個資料庫,其最重要的特性就是_ Data Persistence(資料持久化)_:當用戶儲存了一個值之後,在下次重新啟動服務這個值也應該是有效...
在實現了 service.(AOF) 之後,我們需要思考如何優雅地使用這個介面。 誠然,直接在 SET 指令裡注入這個服務,並且當寫入 repo.(*mapSt...
從 AOF 恢復資料 server.(Restorer) 介面 定義一個 server.(Restorer) 介面,並且實作 server.(*aofResto...
測試是軟體工程中不可或缺的一環,而同時也是 Go 原生支援的特性:只要建立 _test.go 尾綴的檔案,go test 就可以直接使用。 單元測試 resp....
讓我們來回顧一下 cmd.(Command) 的介面與實作:如果想要加入新的 Redis 指令,只需要實作 cmd.(Command) 這個介面,並且在 cmd...
對於一個 Server Client 服務,考慮到網路傳輸成本或是系統內部處理效率等因素,客戶端發出請求之後往往需要等候一小段時間才能獲得回應。 如果在這時伺服...
net.(Listener).Close() 之後做了什麼? 回顧目前的 Server: // file: ./internal/server/server.g...
我們不可能永遠等待 s.wg.Wait() 阻塞,一般服務都會定義強制關閉的超時機制。 註:絕大多數以虛擬機器為基礎的雲服務(AWS EC2, GCP Clo...