【问题标题】:Looking for completely in-memory database with certain qualities寻找具有某些品质的完全内存数据库
【发布时间】:2014-11-17 01:40:30
【问题描述】:

我的应用程序允许多个用户上传他们自己的 Lua 脚本,我希望添加一个数据库功能,没有什么强大的功能,只是一个键/值存储或 NoSQL 类型的东西。

应用程序是一个分叉服务器,因此每个数据库的多个副本非常浪费。

每次应用程序加载时,数据库都会从 Lua 脚本中重新加载,然后自毁(加载后无需保留加载数据)。

我对 MongoDB 和 Redis 非常熟悉,而这些支持的操作对于我的需要来说是多余的。真的,一个 STL 映射就足够了,除了我需要共享数据,而不是每个进程的每个分叉实例的数据的单独副本。我无法可靠地工作的 boost 共享内存 STL 类,并且该服务器需要非常非常可靠。 (如果没有更简单的方法,我会考虑将 Redis 编译到共享模块 (.so) 中)

在此背景下,我正在寻找具有以下特性的仅内存数据库(按优先级顺序,列表中后面的那些不太重要,但仍然需要。

C++源代码

支持 FindGreaterThanOrEqual (upper_bound) 和 FindLessThanOrEqual (lower_bound) 的键值存储 NoSQL

作为主进程的一部分链接或编译,而不是单独的进程。我不希望我们的 DevOP 不得不处理单独的服务器,这又会出错。

不使用 IPC 跨多个进程共享访问,仅共享内存(为了速度)

使用类似这样的 API 非常容易使用(非常粗略的想法):

写入(const char* database_name, const char* key, const char* value)

Write(const char* database_name, const int key, const int value)

字符串读取(const char* database_name, const char* key)

int Read(const char* database_name, int key)

无需创建数据库,如果不存在,则写入应该隐式创建它,而对缺失数据库的读取就像缺失值一样。

有什么建议吗?

【问题讨论】:

标签: c++ performance fork shared-memory nosql


【解决方案1】:

您可以创建一个使用 STL std::mapstd::unordered_map 存储数据的进程,并使用带有请求/回复模式的 IPC 套接字让其他进程访问数据(它们使用密钥请求数据并获取数据回复)。

我强烈建议查看ZMQ 和/或Nanomsg,它们都是高性能、可靠的 tcp 和 ipc 通信库,并且在 C++ 中具有本机绑定。

【讨论】:

    【解决方案2】:

    对于嵌入式数据库,您可以将绑定添加到任何现代嵌入式库,例如 http://sphia.org (http://sophia.systems/)

    如果您需要带有内置数据库的 Lua 语言解释器,可以查看http://tarantool.org

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 1970-01-01
      • 2020-10-03
      • 2020-06-16
      • 1970-01-01
      相关资源
      最近更新 更多