我的应用程序允许多个用户上传自己的Lua脚本,我希望添加一个数据库功能,没有什么高功率的,只是一个键/值存储,或者NoSQL类型的东西。
该应用程序是一个分叉服务器,因此,每个数据库的多个副本是非常浪费的。
每次加载应用程序时,数据库都会从Lua脚本重新加载,然后自毁(加载后无需保留加载数据)。
我非常熟悉MongoDB和Redis,这些支持的操作对于我的需求来说是矫枉过正的。实际上,STL 映射就足够了,除了我需要共享数据,而不是每个进程的每个分叉实例的数据的单独副本。提升共享内存 STL 类我无法可靠地工作,并且该服务器需要非常非常可靠。(将 Redis 编译为共享模块 (.so) 是我会考虑做的事情,如果没有更容易的事情)
有了这种背景,我正在寻找一个具有以下品质的仅内存数据库(按优先级顺序,列表中后面的那些不太重要,尽管仍然需要。
C++源代码
键值存储NoSQL,支持FindGreaterThanOrEqual(upper_bound)和FindLessThanOrEqual(lower_bound)
作为主进程的一部分链接或编译,而不是单独的进程。我不希望我们的 DevOP 必须处理单独的服务器,还有一件事会出错。
跨多个进程共享访问,不使用 IPC,仅共享内存(用于速度)
非常容易使用这样的 API(非常粗略的想法):
写入(常量字符* database_name, 常量字符* 键, 常量字符* 值)
Write(const char* database_name, const intkey, const int value)
字符串读取(常量字符* database_name,常量字符* 键)
int Read(const char* database_name, int key)
无需创建数据库,如果尚不存在,则写入应隐式创建它,并且对丢失的数据库的读取就像缺少的值一样。
有什么建议吗?
您可以创建一个使用 STL std::map
或 std::unordered_map
存储数据的进程,并使用带有请求/应答模式的 IPC 套接字供其他进程访问数据(它们使用键请求数据并在回复中获取数据)。
我强烈建议看看ZMQ和/或Nanomsg,它们都是用于tcp和ipc通信的性能,可靠的库,并且在C++中具有本机绑定。
对于嵌入式数据库,可以将绑定添加到任何现代嵌入式库,例如 http://sphia.org (http://sophia.systems/)
如果您需要带有内置数据库的Lua语言解释器,则可以查看 http://tarantool.org