The Crystal Server KV Library is designed to offer a simple, efficient, persistent, and thread-safe key-value store. It's an abstraction layer that can support various backends (currently, only MySQL is supported). The library provides features such as scoped access to stored values, LRU caching, and type safety. Additionally, it includes a Lua API for easy integration into Lua-based applications.
- Thread-safe Operations: Multi-threaded environment friendly.
- Pluggable Backends: Support for various storage backends.
- Scoped Access: Organization-friendly scoped key-value pairs.
- LRU Caching: Cache management using LRU strategy.
- Strongly Typed: Type-safe value storage.
- Lua API Support: Manipulate KV store via Lua scripts.
#include <kv/kv.h>
// In your class constructor
MyClass(KV &kv) : kv(kv) {}
// Or use the global singleton
KV &kv = g_kv();// Set an integer value
kv.set("age", 30);
// Get an integer value
int age = kv.get<int>("age");// Create a scoped KV store
auto scope = kv.scoped("raids");
// Set and get values in the scoped KV
scope->set("last-occurrence", getTimeNow());
int lastOccurrence = scope->get<int>("last-occurrence");// Create a scoped KV store
auto scope = kv.scoped("raids")->scoped("raid-123");
scope->set("last-occurrence", getTimeNow());
int lastOccurrence = scope->get<int>("last-occurrence");// Create a player-scoped KV store
auto player = g_game().getPlayerById(123);
auto playerKV = player->kv();
playerKV->set("coins", 100);// arrays
kv.set("some-array", {1, 2, 3});
auto someArray = kv.get<ArrayType>("some-array");
// maps
kv.set("some-map", {{"a", 1}, {"b", 2}, {"c", 3}});
auto someMap = kv.get<MapType>("some-map");
// nested maps/arrays with non-uniform types
kv.set("some-nested", {{"a", {1, "string", 3}}, {"b", {"hehe", 5, 6}}});
auto someNested = kv.get<MapType>("some-nested");Errors are logged and return nil. Always check for nil when using kv.get().
-- Set and get an integer value
kv.set("age", 30)
local age = kv.get("age")-- Create a scoped KV store
local scope = kv.scoped("raids")
-- Set and get values in the scoped KV
scope.set("last-occurrence", getTimeNow())
local lastOccurrence = scope:get("last-occurrence")-- Create a scoped KV store
local scope = kv.scoped("raids"):scoped("raid-123")
scope:set("last-occurrence", getTimeNow())
local lastOccurrence = scope:get("last-occurrence")-- Create a player-scoped KV store
local player = Player(123)
local playerKV = player:kv()
playerKV:set("coins", 100)-- arrays
kv.set("some-array", {1, 2, 3})
local someArray = kv.get("some-array")
-- maps
kv.set("some-map", {{"a", 1}, {"b", 2}, {"c", 3}})
local someMap = kv.get("some-map")
-- nested maps/arrays with non-uniform types
kv.set("some-nested", {{"a", {1, "string", 3}}, {"b", {"hehe", 5, 6}}})
local someNested = kv.get("some-nested")