增加内存数据结构的耐久性

9
有哪些流行的技术可以为内存数据结构增加耐久性(即)如果进程崩溃,您可以保留该数据结构上执行的所有先前操作?
如果我的数据结构只涉及元组列表,则我会将它们存储在SQL数据库中,这样可以免费提供耐久性。但是如果我的数据结构是图形或树形结构呢?
我能想到的一件事是显式地将所有操作记录到磁盘(仅追加日志),并在崩溃事件发生时重放日志以保留先前状态。如果日志变得太大,则会进行压缩步骤。我猜这就是数据库引擎在内部实现耐久性的方式(这个过程被称为检查点)?
顺便提一下,这不是整个数据集都不适合内存的情况。
6个回答

4

对象普及引擎似乎就像我建议的那样工作 - 更改会被记录以进行系统恢复。无论如何,感谢这些链接。它们看起来很有趣! - Harish
Justice,你用过Prevayler吗?你能回答一下我关于它的问题吗?https://dev59.com/8EbRa4cB1Zd3GeqPykTD - Sergey
1
根据我的经验,Prevalence 在小型、写入密集的数据集上表现非常出色。但对于那些不直观理解 Prevalent 对象所要求的限制条件,特别是在时间或空间移位计算面前保持确定性的开发人员来说,其效果则较差。 - Jeffrey Hantin

1
我已经在两家公司的产品中实现了“Mrjb”技术,这基本上就是您在问题中建议的:一种“内存常驻日志支持”的数据库,它是一个内存数据结构,每次更改都会被记录到磁盘上。对我们来说,它非常有效!

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

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


0
你要找的词是“序列化”。

我显然听说过“序列化”这个词。显然,每次操作后将整个数据结构天真地序列化到磁盘上在理论上是可行的,但在实践中并不可行。我所说的是要高效地执行此操作(否则将内存中的数据放在那里有什么意义呢?) - Harish
啊!也许一些缓存机制会更适合你? - Rik

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

0

是的,您需要将数据序列化为某种格式 - xml、二进制或其他格式。根据编程语言,这可能已经为您内置了。Java有ObjectStreams,.NET有XmlSerializerBinaryFormatter


0

对于你的问题,任何答案都需要像ACID数据库系统一样做某些事情。因此,我建议你最好使用关系型数据库管理系统来存储应用程序状态,在必须保留(应用程序)事务时进行更新。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接