當前位置: 妍妍網 > 碼農

微軟開源計畫Garnet:Redis的競爭者還是替代者?

2024-03-27碼農

對於開源社群,最近的一大新聞就是Redis宣布從7.4版本開始,將采用Redis原始碼可用授權證(RSALv2)和伺服器端公共授權證(SSPLv1)的雙重授權證,取代原有的BSD三條款授權證。這一變化引發了開發者社群的熱烈討論,同時也為微軟的新開源計畫Garnet帶來了更多的關註。那麽,Garnet究竟是什麽?它與Redis有何關系?讓我們一起來探討。

1. Garnet是什麽?

Garnet是微軟研究院的新開源計畫,它是一個遠端緩存儲存,提供了一系列獨特的優勢。Garnet采用了Redis的RESP協定作為起點,這使得開發者可以使用大多數程式語言中現成的Redis客戶端,例如 .NET 中的StackExchange.Redis,來使用Garnet。相比於其他開源緩存儲存,Garnet在效能、延遲、可延伸性和永續性方面有顯著的提升。

Garnet

2. Garnet的特點

Garnet的特點可以概括為以下幾點:

1. 相容性 :Garnet采用了RESP協定,這使得它可以與大多數現有的Redis客戶端無縫對接。 2. 高效能 :Garnet提供了更好的吞吐量和可延伸性,尤其在處理大量客戶端連線和小批次數據時,相比於其他開源緩存儲存,Garnet的效能有顯著提升。 3. 低延遲 :Garnet在普通雲(例如Azure)虛擬機器上,使用加速TCP,可以實作極低的客戶端延遲,這對於實際套用場景至關重要。 4. 跨平台 :Garnet基於最新的.NET技術,可以在Linux和Windows上執行,同時,它也非常易於開發和擴充套件,而不會犧牲效能。 5. 豐富的API :Garnet實作了一系列API,包括原始字串操作(例如gets、sets和key expiration)、分析操作(例如HyperLogLog和Bitmap)、物件操作(例如sorted sets和lists)等。此外,它還支持使用者定義自訂操作,降低了開發自訂擴充套件的難度。 6. 安全性 :Garnet支持使用.NET的SslStream庫進行安全的傳輸層安全(TLS)通訊,同時提供基本的存取控制。 7. 永續性和可恢復性 :Garnet的儲存層,稱為Tsavorite,支持執行緒可延伸性、分層儲存(記憶體、SSD和雲端儲存)、快速非阻塞檢查點、恢復、操作日誌記錄以及多鍵事務支持等強大的資料庫功能。 8. 集群模式 :Garnet支持集群模式,可以進行分片、復制和動態鍵遷移。

3. Garnet與Redis的關系

Garnet並非是要取代Redis,而是提供了一個與Redis相容的、具有一些獨特優勢的選擇。與Redis不同的是,Garnet是基於.NET技術構建的,這使得它在效能和可延伸性上有所提升,同時也使得它更易於開發和擴充套件。

在Redis宣布授權證變更的同時,微軟釋出了Garnet,這無疑給開發者社群提供了一個新的選擇。對於那些不希望或無法接受Redis新的授權證政策的使用者,Garnet可能是一個不錯的替代方案。

4. Garnet的部署和使用

Garnet 開源地址:https://github.com/microsoft/garnet?WT.mc_id=DT-MVP-5005195 。開發者可以透過該地址獲取Garnet的原始碼,並了解更多關於Garnet的資訊。

4.1 服務部署

Garnet的服務部署非常簡單,Garnet是基於.NET技術構建的,也提供了多種部署方式供開發者靈活的選擇。你可以直接將其作為獨立的服務自行編譯部署,也可以透過 Nugget 包的方式引入並整合到你的計畫中,當然官方也貼心的提供了多種 Dockerfile 方便開發者快速部署。這裏我們簡單介紹一下如何編譯並執行 Garnet 服務和如何透過客戶端使用。

4.1.1 源碼構建

首先,你需要安裝 .NET SDK,然後透過 Git 將 Garnet 的源碼複制到本地:

git clone [email protected]:microsoft/garnet.gitcd garnetdotnet restorecd main/GarnetServerdotnet run -c Release -f net8.0

透過上面的命令我們即可快速的啟動一個 Garnet 服務,預設情況下,Garnet 偵聽 TCP 埠 3278。

Garnet

當然我們也可以編譯成一個獨立的可執行檔,以下是編譯 win-x64 平台的範例命令:

dotnet publish -c Release -f net8.0 -r win-x64 -o=publish/win-x64 -p:PublishSingleFile=true -p:PublishTrimmed=true

4.1.2 客戶端使用

使用 Garnet 的客戶端非常簡單,只需要按照 Redis 客戶端庫的使用方式無縫切換即可。這裏我們以 C# 為例,使用 StackExchange.Redis 客戶端庫來連線 Garnet 服務。

首先,我們需要安裝 StackExchange.Redis 客戶端庫:

dotnet add packageStackExchange.Redis

然後,我們可以透過以下程式碼來連線 Garnet 服務並進行操作:

usingSystem;usingStackExchange.Redis; classProgram{staticvoidMain(string[] args) { var connection = ConnectionMultiplexer.Connect("localhost:3278");var db = connection.GetDatabase(); db.StringSet("key", "value");var value = db.StringGet("key");Console.WriteLine(value); }}

以上只是簡單的使用,如果你需要集群等更復雜的配置,請查閱 官方文件 [1]

5. 相容性

需要註意的是,Garnet雖然相容Redis的RESP協定,但並不是完全相容Redis的所有功能。在使用Garnet時,開發者需要註意一些細節,例如Garnet不支持Redis的一些命令、數據結構和特性,這可能會對一些套用場景造成影響。因此,在使用Garnet時,開發者需要根據自己的實際需求進行選擇。具體的相容性問題,可以參考Garnet的官方文件關於 相容性的描述 [2]

6. 結論

作為微軟的新開源計畫,Garnet無疑為開發者社群帶來了新的可能性。它的出現並非要取代Redis,而是提供了一個與Redis相容的、具有一些獨特優勢的選擇。對於開發者來說,Garnet的出現無疑為他們提供了更多的選擇,而這對於開源社群的發展來說,無疑是一件好事。如果你正在尋找一個Redis的替代方案,那麽Garnet可能是一個不錯的選擇。

References

[1] 官方文件: https://microsoft.github.io/garnet/?WT.mc_id=DT-MVP-5005195
[2] 相容性的描述: https://microsoft.github.io/garnet/docs/welcome/compatibility?WT.mc_id=DT-MVP-5005195