【问题标题】:Adding durability to in-memory data structures为内存数据结构增加持久性
【发布时间】:2026-01-30 23:05:01
【问题描述】:

您可以采用哪些流行技术来增加内存数据结构的持久性(即,如果进程崩溃,您可以保留之前对该数据结构执行的所有操作?

如果我的数据结构只包含一个元组列表,那么我只需将它们存储在 SQL DB 中,这样我就可以免费获得持久性。但是,如果我的数据结构是图或树怎么办?

我能想到的一件事是将所有操作显式记录到磁盘(仅附加日志),并在发生崩溃时重播日志以保留以前的状态。如果日志变得太大,那么就会有一个压缩步骤。我猜这是数据库引擎在内部为持久性所做的事情(检查点就是这个过程的名称)?

顺便说一句,这不是整个数据集不适合内存的情况。

【问题讨论】:

    标签: serialization data-structures


    【解决方案1】:

    您可能想尝试object prevalence engine。对于 .NET,您可能想尝试 Bamboo.Prevalence,它是类似引擎的一个端口,称为 Java 的 Prevayler

    【讨论】:

    • 对象流行引擎似乎就像我建议的那样工作 - 为系统恢复记录更改。无论如何感谢这些链接。它们看起来很有趣!
    • Justice,你用过 Prevayler 吗?你能回答我关于它的问题吗? *.com/questions/454294/…
    • 根据我的经验,流行度非常适合小型、写入密集型数据集。对于不直观地理解流行对象所需约束的开发人员来说,它的效果不太好——尤其是面对时移或空间移位计算时的确定性。
    【解决方案2】:

    我已经在 2 家公司的产品中实现了“Mrjb”技术,这基本上正是您在问题中所建议的:“内存驻留日志支持”数据库,一种内存数据结构,每次更改都在其中在发生时记录到磁盘。它对我们很有用!

    http://www.edval.biz/memory-resident-programming-object-databases

    我很乐意分享我们在生产环境中使用它的实际经验。我喜欢能够回放精确的事件序列或回滚到任何时间点。

    【讨论】:

      【解决方案3】:

      您要查找的词是“序列化”。

      【讨论】:

      • 我显然听说过“序列化”这个词。显然,在每次操作后将整个数据结构简单地序列化到磁盘在理论上是可行的,但在实践中却行不通。我说的是有效地执行此操作(如果不是将数据存储在内存中又有什么意义?)
      • 啊!也许一些缓存机制会更适合你?
      【解决方案4】:

      您可以想出一些方法来序列化您的结构,无论是使用 XML、YAML、JSON 等。然后您可以将其存储在数据库中,或者在主执行点周围放置一个大的 try/catch 到程序。然后,如果发生一些未捕获的异常,这将导致程序崩溃,您可以序列化您的数据,以及记录任何错误消息、堆栈跟踪等。

      【讨论】:

        【解决方案5】:

        是的,您可能希望将数据序列化为某种格式 - xml、二进制等。根据编程语言,这可能是为您内置的。 Java 有ObjectStreams,.NET 有XmlSerializerBinaryFormatter

        【讨论】:

          【解决方案6】:

          对您的问题的任何回答都需要执行类似于 ACID 数据库系统的操作。所以我想说你最好的选择是使用 RDBMS 来存储你的应用程序状态,当你有一个不能丢失的(应用程序)事务时更新。

          【讨论】: