C++ 寻求简单内存中DB*服务器*(无需持久性)的建议

C++ 寻求简单内存中DB*服务器*(无需持久性)的建议,c++,database,linux,odbc,in-memory-database,C++,Database,Linux,Odbc,In Memory Database,应支持多个连接,最好通过ODBC。客户端将在同一台计算机上作为单独的进程运行。不需要持久性,因为客户端将在其他地方处理持久性。如果客户机有问题,客户机用C++编写。 数据非常简单,它是一组不相关的双向地图。可直接通过值或范围(X和Y之间的)进行访问,无需更新。我们实际上不需要SQL,所以也可以考虑非SQL解决方案 客户端应用程序是多进程的,可以在多台机器上运行。每台机器都应该有这样一个数据库的本地副本,由其本地客户端根据中央存储进行更新 多次编辑: 平台是Linux 出于安全原因,RAM磁盘不是

应支持多个连接,最好通过ODBC。客户端将在同一台计算机上作为单独的进程运行。不需要持久性,因为客户端将在其他地方处理持久性。如果客户机有问题,客户机用C++编写。 数据非常简单,它是一组不相关的双向地图。可直接通过值或范围(X和Y之间的
)进行访问,无需更新。我们实际上不需要SQL,所以也可以考虑非SQL解决方案

客户端应用程序是多进程的,可以在多台机器上运行。每台机器都应该有这样一个数据库的本地副本,由其本地客户端根据中央存储进行更新

多次编辑

  • 平台是Linux
  • 出于安全原因,RAM磁盘不是一个选项-我们不希望任何能够访问该机器的人都能够查看数据
  • 数据只能以加密的形式持久化,因此解决方案要么根本不持久化数据,要么允许用户定义的过滤器/插件进行持久化
  • 试试看。这不是一个明显的选择,但它基于关系数据库概念

    网络上多索引的概念 相同的元素集合是相同的 借用关系数据库 术语和允许 复杂数据规范 多元精神下的结构 索引关系表,其中简单 集合和映射是不够的。宽阔的 提供了指数的选择, 以类似STL容器为模型 像std::set、std::list和hash 设置


    只是因为我熟悉它,我会选择mysql。要将其用作内存中的数据库,请将内存用作表类型。Redis是一个内存中的NoSql数据库,它可能非常适合这种情况(它在内存中运行,只有为持久性而写的光盘才可以被禁用)。

    使用mysql with datadir=您为此安装的tmpfs。当然,您需要编写一些启动脚本,在启动时安装数据库(使用mysql\u install\u db或其他工具),因为您将丢失所有数据。

    可能是一个可行的解决方案。它是一个键值存储,可以设置为在一定时间内保存值,具有可扩展性,并且易于设置和开始使用。它也可以在各种环境中运行,尤其是主页几乎没有什么帮助。

    在打开RAM db的情况下不使用SQLite有什么特殊原因吗?

    出于安全原因,RAM磁盘不是一个选项-我们不希望任何有权访问机器的人都能查看数据

    你真倒霉。任何有权访问机器的人都可以在/proc/$PID/mem之外查看数据


    如果你说的是非根目录访问,那么就不要在chmod 700中使用/tmp/$directory/方法。

    这里有一个在Linux下可以使用的技巧,叫做“延迟卸载”

  • 在某处安装tmpfs
  • 启动一些进程来使用它,将chdir()插入该目录。您可以使用mysql实例;mysql总是对其数据目录执行chdir
  • 进程成功启动后,使用-l(lazy)选项umount tmpfs
  • 现在,tmpfs仍然存在,并且只要进程正在访问它,它就将继续存在,但不相关的进程无法再访问它,因为它不再存在于其装载点中

    请注意,这并不能阻止root在tmpfs中获取数据,只会让它变得更加困难


    还请注意,它可能会被交换,因此如果您绝对需要它是非持久性的,则应禁用交换(或使用加密交换)。

    Berkeley DB支持内存中的数据库以及复制。你也可以在“内存”文件系统上运行任何东西(包括RDBMS/SQL Server)。我不知道为什么会投反对票,这对我来说似乎是一个合理的问题。@Vlad Lazarenko:我通常不会在不先研究和分析问题的情况下提问。“内存文件系统”(又名RAM磁盘)被认为不适用于安全原因。我认为(如果是你的话)否决权是不值得的。@davka:如果你在问题中也详细说明这一点,可能会有所帮助。不过我不会对问题投否决票。@Vlad:我同意。我们考虑了很多设计方案,所以我忘了……我已经将其用于内存映射文件。无法处理事务,因此获取损坏数据的更改非常高。它也不支持复制。但对于某些问题,这是一个很好的解决方案@弗拉德-谢谢你的信息。我与这个库没有太多关系,但最近回答了这个领域的几个问题,它看起来非常有用。我对它很熟悉,但它是
    进程中的
    容器。我们的应用程序是多进程的,因此我们不希望在每个进程中复制数据。更重要的是,由于有些进程是按请求运行的,所以我们每次都需要初始化容器。因此需要一台服务器,每台机器一台。@davka-内存中的数据库通常是每进程一台,而不是每台机器一台。您可能需要编写一个进程来托管任何内存中的数据库(或缓存),并为该进程提供一个代理,以支持每台需要访问后端数据库中托管的持久化数据的计算机的多个客户端。@Steve:这正是我们试图避免的,至少在第一阶段是这样的…:)否则,选择嵌入式内存数据库似乎相当简单,从SQLiteThank开始,看起来很有趣。您知道Radis是否支持范围,或者至少支持
    get next/previous key
    命令吗?另一个问题是,我们实际上不应该拥有非加密形式的持久数据。我应该在问题中提到这一点……是的,Redis进行范围查询。说到mysql,你大概知道每个客户端安装许可证的成本是多少吗?说实话,我从来没有真正理解过Oracle的li