事务性,内存中,对象/键/值存储库?

时间:2011-02-25 11:36:38

标签: c++ database key-value

我有一个C ++应用程序,其内存数据集由一组对象组成,每个对象都附加了一个键/值集。对象和键由int id引用,值始终是单个类的实例。关键ID在对象中是唯一的,对象ID在Universe中是唯一的。

几乎一个map<pair<int, int>, value>,除了我有额外的要求,我需要能够枚举附加到特定对象的键。这一切都需要是事务性的,所以如果出现问题我可以回滚更改。

这一切都让我觉得这是一个完全标准的问题,我应该能够获得现成的代码,但我一直无法找到任何东西。任何人都可以:

(a)告诉我这个问题实际上是什么,所以我知道要找什么;

(b)建议我应该查看的任何代码。

请注意,我希望这只是一个内存中的数据存储,因此像Berkeley DB这样的NoSQL方法并不合适 - 我不想继续读取和写入值对象(它们是中等复杂的)。

到目前为止,我发现了不执行事务的简单方法(如boost_multi_index,甚至只是嵌套的STL映射),或使用持久存储的复杂方法,但两者之间没有任何内容。我可以在基本存储的基础上实现自己的事务层,但说实话,我宁愿不这样做。

我错过了什么?

编辑:好吧,似乎没有人能够建议一个人;所以我写了自己的。这是令人惊讶的,但实际上并不是很多代码。现在它只是一个使用嵌套映射进行存储的模板类,但我正在考虑改为使用boost :: multi_index_container来简化。它没有抛光,可能充满了虫子,但如果有人认为可以使用它,请告诉我。

更多修改:作为参考,我发现我正在寻找的Google朋友名称是实体/属性/值数据库(EAV)。< / p>

3 个答案:

答案 0 :(得分:3)

你真正关注的是异常安全容器。

阅读这些: http://www.boost.org/community/exception_safety.html http://lmzr.perso.neuf.fr/attic/Exception_Safe_Generic_Containers.pdf http://www.drdobbs.com/184401771;jsessionid=TTP1SXYYVJZPLQE1GHPCKH4ATMY32JVN

您的问题很快就会减少,以确保存储对象的构造函数,复制构造函数,赋值运算符等中的特定异常保证。 如果没有发生这种情况,那么很可能你没有设计足够小心的对象类型来分离关注点。

答案 1 :(得分:0)

您考虑过Redis了吗?它是一个数据结构服务器,因此您可以使用地图结构并轻松枚举附加到对象的键(请参阅hash families of commands)。它也支持transactions

我认为缺点是我不确定打包成文库是多么容易。

答案 2 :(得分:0)

LMDB会处理这个问题。您可以将它与tmpfs上的文件一起使用,以保证所有操作都只在内存中,或者在普通的ext3 / ext4文件系统上使用它,并且提交时间极长,以避免更改写入磁盘。它完全是事务性的,并使用内存映射文件;如果您的文件系统缓存写回时间设置得足够长并且您使用异步提交运行它,那么您的更改将仅存在于RAM中并且永远不会刷新到磁盘。 它可以进行零拷贝读写;您可以使用最少的序列化来编写对象,并使用零反序列化来引用它们。

相关问题