【问题标题】:Preloading data into RAM for fast transaction将数据预加载到 RAM 以实现快速事务
【发布时间】:2018-03-25 05:12:56
【问题描述】:

我的想法是,如果我们预先加载客户的数据(账号,netbalance),并且每当处理交易时,txn记录以FIFO数据结构写入RAM,并更新客户在RAM中的数据,然后在一段时间后将记录写入磁盘中的数据库,以防止由于波动而导致RAM中的数据丢失。

这样做可以节省 I/O 时间,并减少为目标寻找客户数据的时间(更快的事务)。

我听说过内存数据库,但我不知道我的想法是否与那个相同。另外,还有比我想的更好的主意吗?

【问题讨论】:

    标签: c++ database transactions in-memory


    【解决方案1】:

    在我看来,要向前迈出一步,需要考虑/研究几个方面。预加载和处理数据通常比绑定到磁盘/数据库页面访问模式更快。但是,您会立即失去耐用性。因此,三种方法在不同的情况下是有效的:

    磁盘同步(旧的数据库方式很好,每次交易后数据都保证永久存储)

    内存中(只要系统启动并运行就很好,速度快几个数量级,有因错误而丢失交易数据的风险)

    延迟(基本上在内存中,但有时数据会刷新到磁盘)

    值得注意的是,延迟在 Linux 上通过 Memory-Mapped 文件直接得到支持,这些文件 - 一方面 - 通常与普通内存一样快(除非读取和访问太多页面),另一方面是同步的自动(但不是立即)到磁盘。

    当您标记 C++ 时,这可能是让您的想法运行的最简单方法。

    但是请注意,当假设发生故障(硬件、重新启动等)时,您根本不会有事务,因为要具体说明何时实际写入数据并非易事。

    附带说明:有时,通过(可靠地)写入日志文件(顺序访问,因此比直接写入数据文件更快)来解决此问题。在数据库上下文中搜索单词 Compaction:这是将日志与通常使用的磁盘数据结构合并的操作,并且不时发生(当日志变得太大时)。

    问题的最后一个方面:是的,内存数据库在主内存中工作。尽管如此,根据他们提供的保证(ACID?),某些操作仍然涉及硬盘或 NVRAM。

    【讨论】:

    • 非常感谢我学到了很多你在这里介绍的术语,确实给了我解决可能丢失数据问题的实用方法。是的,我会用 C++ 来实现它,因为这对我来说是最熟悉的语言,而且我不知道其他 API 可以做这样的事情。
    猜你喜欢
    • 1970-01-01
    • 2015-06-20
    • 2022-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多