爲構建實時應用程序而優化的數據庫
DiceDB 是爲構建實時應用程序而優化的數據庫,它在某些方面可以替代 Redis,它內置了 SQL 查詢支持。
它與 Redis 有何不同?
-
DiceDB 是多線程的,遵循無共享架構。
-
DiceDB 支持一個名爲 QWATCH 的新命令,該命令允許客戶端監聽 SQL 查詢,並在數據發生變化時實時收到通知。
注意:DiceDB 仍在開發中,它支持 Redis 命令的一個子集。所以,請不要在生產中使用它。但是,你可以參考學習它的設計思想。
最簡單的方法查看和了解 DiceDB 的特性是通過 Docker 安裝並運行它。
docker run dicedb/dice-server
上述命令將啓動在端口 7379 上運行的 DiceDB 服務器,你可以使用 DiceDB CLI 和 SDK 連接到它。你還可以使用 Redis CLI 和 SDK 連接到它。
dice-cli
127.0.0.1:7379>
我們來演示一個最簡單的 Hello World。
首先,你需要啓動 DiceDB,然後使用 Dice 連接它。
現在,我們存儲 “Hello World” 消息到 DiceDB。我們使用 SET 命令,執行語法和 Redis 類似,例如:
127.0.0.1:7379> SET mykey "Hello, World!"
OK
當我們存儲成功後,我們可以使用 GET 命令獲取數據
127.0.0.1:7379> GET mykey
"Hello, World!"
這只是 DiceDB 的一面,和 Redis 很相似。現在我們看看它的另一面。計算存儲遊戲排行榜。在遊戲世界中,排行榜對於跟蹤玩家排名和提高參與度至關重要。DiceDB 是一種具有實時反應性的內存數據存儲,是實現快速、可靠和可擴展排行榜的絕佳選擇。
我們來看下如何實現它。
一、錄入玩家統計數據
我們使用一些樣例數據存入到 DiceDB。我們使用 JSON.SET 命令來存儲玩家得分。
JSON.SET match:1:player:1 $ {"name": "aquaman", "score": 5}
JSON.SET match:1:player:2 $ {"name": "batman", "score": 5}
JSON.SET match:1:player:3 $ {"name": "cyclops", "score": 2}
JSON.SET match:1:player:4 $ {"name": "deadpool", "score": 9}
注意:如果你使用 Redis,那麼你需要使用 Sorted Set 來構建排行榜,但使用 DiceDB,你可以使用 JSON.SET 命令來存儲元數據,並將玩家得分作爲頂級鍵值對。
二、查詢玩家數據
你需要打開另一個終端窗口,使用 CLI 連接到 DiceDB。要獲取排行榜,你需要使用 QWATCH 命令。
QWATCH "SELECT $key, $value FROM 'match_1:%' ORDER BY $value.score DESC"
此命令將持續按值(分數)降序排列給出鍵值對列表。
三、更新玩家分數
當玩家完成遊戲時,你需要更新它們的分數。使用 JSON.SET 命令再次更新玩家的分數並將其設置爲新值。
假設我們將 cyclops 的分數增加到 10,那麼使用如下命令:
JSON.SET match:1:player:3 $.score 10
四、實時排行榜
我們已經使用 QWATCH 命令獲取排行榜,任何數據更新時,它都會重新評估查詢,並按照降序發出鍵值對列表。
因此,您的客戶端實時獲得排行榜,而無需定期輪詢的查詢數據。
查看更多內容,請參考 Github:
https://github.com/DiceDB/dice
個人建議:我粗略閱讀了 DiceDB 的使用文檔,它在實時方面,相比 Redis 還是有很大的優點,在性能方面,查看它的 Benchmark 數據和 Redis 性能差不多。但是,它還沒有成熟,也沒有 Redis 那樣廣泛運用於生產中,經過多年的改進優化。推薦你在非常需要它的實時特性方面使用它,並在運行於生產環境時謹慎選擇。可以跟蹤關注,學習它的設計思想。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/D58-cw1SUxIgq3A19AYU5g