你是否正在使用 Redis 作為您的數據結構存儲,享受它的高性能、高可用的特性?如果是這樣,那麼你可能會對 KeyDB 感興趣。 什麼是 KeyDB? KeyDB 一個由 Snap 提供支持、專為擴展而構建的開源資料庫。它是 Redis 的高性能分支,專註於多線程、記憶體效率和高吞吐量。KeyDB 採 ...
你是否正在使用 Redis 作為您的數據結構存儲,享受它的高性能、高可用的特性?如果是這樣,那麼你可能會對 KeyDB 感興趣。
什麼是 KeyDB?
KeyDB 一個由 Snap 提供支持、專為擴展而構建的開源資料庫。它是 Redis 的高性能分支,專註於多線程、記憶體效率和高吞吐量。KeyDB 採用 MVCC 體繫結構,允許您執行 KEYS 和 SCAN 等查詢,而不會阻塞資料庫並降低性能。KeyDB 保持與 Redis 協議、模塊和腳本的完全相容性,這包括腳本和事務的原子性保證。由於 KeyDB 與 Redis 開發保持同步,KeyDB 是 Redis 功能的超集,這使得 KeyDB 成為現有 Redis 理想的替代品。
項目地址:https://docs.keydb.dev/
源碼地址:https://github.com/Snapchat/KeyDB
KeyDB 獨有特性
除了與 Redis 相同的功能外,KeyDB 還提供了一些獨有的特性,例如:
- 無阻塞架構:採用一種 MVCC 體繫結構,允許你可以查詢資料庫的單個快照,從而避免阻塞 SCAN 和 KEYS 等調用。這樣可以大規模併發調用此類查詢,而不會降低現有工作負載的整體性能。
- 跨區域主動複製:這是一種新的複製模式,允許你在多個主節點之間進行雙向非同步複製。這樣可以實現跨區域的多主站支持,提高數據可用性和一致性,無需哨兵監視節點進行故障轉移。
- 子項過期:這是一種新的過期機制,允許你對集合中的成員設置過期時間。這樣可以實現更細粒度的數據管理和清理。
- TLS加密:這是一種新的安全機制,為你的數據提供 TLS(傳輸層安全)支持。KeyDB 的 TLS 性能是 Redis + TLS 的 7 倍,並且不需要任何額外的配置或證書。
- JavaScript 模塊:這是一種新的擴展機制,讓你可以使用 JavaScript 來編寫自定義的命令和邏輯。JavaScript 模塊基於 V8 引擎構建,比 Lua 更快,並且支持許多 Node.js 模塊。
KeyDB 性能測試
在同一硬體上,KeyDB 可以實現比 Redis 高得多的吞吐量。主動複製簡化了熱備盤故障切換,使你能夠輕鬆地跨副本分佈寫入操作,並使用簡單的基於 TCP 的負載平衡/故障轉移。KeyDB 的更高性能允許你在更少的硬體上做更多的事情,從而降低運營成本和複雜性。
下圖為Redis、TLS 和多線程 KeyDB 基準測試比較:
測試顯示,在 Redis 6(單線程)上啟用 TLS 的情況下,測量值下降了 36%。但是,如果你以前使用過 I/O 線程功能,則可能會看到性能下降 61%,因為使用 TLS 不支持 I/O 線程。
下圖為Redis、TLS 和多線程 KeyDB 延遲基準測試比較(數值越低越好):
可以看到,使用 TLS 時,這些負載下的延遲明顯更高。KeyDB 不僅在非常高的容量下提供服務,而且延遲也比使用 TLS 的 Redis 低 7 倍。
下圖為使用 YCSB 對 Redis 6 多線程 I/O 與 Elasticache 和 KeyDB 進行吞吐量測試比較:
很明顯,KeyDB 在每個測試的工作負載下都實現了最高的吞吐量。Elasticache 排在第二位,其次是 Redis 6。可以註意到,在沒有 I/O 線程的情況下,Redis 6 仍然比版本5快。
下圖為使用 YCSB 對 Redis 6 多線程 I/O 與 Elasticache 和 KeyDB 進行延遲測試比較(以微秒為單位,值越低越好):
上面顯示的趨勢表明,當實例接近其容量吞吐量時,延遲會顯著增加。KeyDB 可以處理比 Redis 6 高得多的吞吐量,並且略高於 Elasticache,因此能夠在更高的負載下保持較低的延遲。
KeyDB、Elasticache 和 Redis 6 在輕度到中等流量下都有類似的延遲。直到容量開始達到更高的負載,才能看到差異。
更多測試內容請移步這裡查看:https://docs.keydb.dev/blog
如何使用 KeyDB?
由於 KeyDB 與 Redis完全相容,使得它非常容易使用,我們可以像 Redis 一樣來使用它。來做一個簡單的示例,演示如何連接到 KeyDB,設置和獲取一個字元串值,以及使用 EXPIREMEMBER 命令來設置子項過期。
KeyDB命令文檔:https://docs.keydb.dev/docs/commands/#expiremember
首先,從 Docker Hub 拉取 KeyDB 的鏡像並運行:
# 拉取 KeyDB 的鏡像 docker pull eqalpha/keydb # 運行 KeyDB 的容器 docker run -p 6379:6379 -d eqalpha/keydb
然後,創建一個控制台應用程式,安裝 StackExchange.Redis 庫:
# 創建一個控制台應用程式 dotnet new console -o KeyDBDemo # 安裝 StackExchange.Redis 庫 nuget install StackExchange.Redis
然後,編輯 Program.cs 文件,添加以下代碼:
using StackExchange.Redis; public class KeyDBDemo { private static void Main(string[] args) { // 創建一個連接到本地Redis實例的連接器 ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost"); // 獲取一個資料庫對象 IDatabase db = redis.GetDatabase(); // 設置一個字元串值,鍵為 "name",值為 "Bing" db.StringSet("name", "Bing"); // 獲取鍵為 "name" 的字元串值 var name = db.StringGet("name"); // 列印結果 Console.WriteLine($"The name is {name}"); // 設置一個集合值,鍵為 "fruits",值為 ["apple", "banana", "orange"] db.SetAdd("fruits", new RedisValue[] { "apple", "banana", "orange" }); // 為集合中的成員 "apple" 設置過期時間為 5 秒 db.Execute("EXPIREMEMBER", "fruits", "apple", 5); // 獲取鍵為 "fruits" 的集合值 var fruits = db.SetMembers("fruits"); // 列印結果 Console.WriteLine($"The fruits are {string.Join(", ", fruits)}"); // 等待 5 秒後,再次獲取鍵為 "fruits" 的集合值 Thread.Sleep(5100); fruits = db.SetMembers("fruits"); // 列印結果 Console.WriteLine($"The fruits are {string.Join(", ", fruits)}"); // 關閉連接 redis.Close(); } }
最後,運行程式,可以得到以下結果:
The name is Bing The fruits are banana, apple, orange The fruits are banana, orange
寫作不易,轉載請註明文章出處,否則禁轉!!!