为内存中的数据结构增加持久性
时间:2020-03-06 15:04:36 来源:igfitidea点击:
我们可以采用哪些流行的技术来增加内存中数据结构的持久性(即,如果进程崩溃,则可以保留该数据结构上所有以前执行的操作)?
如果我的数据结构只涉及一个元组列表,那么我将它们存储在SQL DB中,这将使我免费获得持久性。但是,如果我的数据结构是图还是树,该怎么办?
我能想到的一件事是将所有操作明确地记录到磁盘(仅追加日志),并且在发生崩溃的情况下,重播日志以保留以前的状态。如果日志太大,则将执行压缩步骤。我猜想这是数据库引擎在内部为持久性所做的事情(检查点就是这个过程的名称)?
顺便说一句,这不是整个数据集都不适合内存的情况。
解决方案
我们要查找的单词是"序列化"。
我们可以想出某种方法来序列化结构,无论是使用XML,YAML,JSON还是其他方法。然后我们可以将其存储在数据库中,或者在程序的主要执行点周围进行大量尝试/捕获。然后,如果发生某些未捕获的异常,这将导致程序崩溃,则可以序列化数据,并记录所有错误消息,堆栈跟踪等。
是的,我们希望将数据序列化为某种格式的xml,二进制或者其他格式。根据编程语言的不同,它可能是为我们内置的。 Java具有ObjectStreams,.NET具有XmlSerializer和BinaryFormatter。
我们对问题的任何回答都将需要做一些像ACID数据库系统一样的事情。因此,我要说的最好的选择是使用RDBMS存储应用程序状态,并在每次拥有不丢失的(应用程序)事务时进行更新。
我们可能要尝试使用对象普遍性引擎。对于.NET,我们可能需要尝试Bamboo.Prevalence,它是一个称为Prevayler for Java的类似引擎的端口。