我有其存储器内数据集包括一组对象,其每一个具有一个附加的键/值集合的C++应用程序。对象和键由int id引用,并且值始终是单个类的实例。键ID在对象中是唯一的,对象ID在宇宙中是唯一的。事务性,内存中的对象/键/值存储库?
这是几乎除了我有需要能够枚举连接到一个特定对象的密钥有关的附加需求的map<pair<int, int>, value>
。这一切都需要事务性处理,所以如果出现问题,我可以回滚更改。
这一切都让我觉得是一个完全标准的问题,我应该能够获得现成的代码,但我一直无法找到任何东西。任何人都可以:
(一)告诉我,这个问题实际上是调用,所以我知道要寻找什么;
(二)建议的任何代码,我应该看看。
请注意,我只希望这是一个内存数据存储,所以NoSQL的方法就像Berkeley DB不合适---我不想继续读和写值对象(这是适度复杂的) 。
到目前为止,我发现,不做交易(如boost_multi_index,甚至只是嵌套的STL地图),无论是简单的办法,或者使用永久存储,但没有在两者之间复杂的方法。我可以在基本存储上实现自己的事务层,但说实话,我宁愿不。
我错过了什么?
编辑:好了,没有人似乎已经能够提出一个;所以我写了我自己的。令人惊讶的是,它并不是非常多的代码。现在它只是一个使用嵌套地图进行存储的模板类,但我正在考虑改为使用boost :: multi_index_container来代替简单。它没有打磨,可能充满了虫子,但如果有人认为他们可以使用它,让我知道。
更多编辑:作参考,事实证明,什么我要找的Googleable名称是实体/属性/值数据库(EAV)。
用下面的语句看看SQLite:memory:pseudo-DB – 0xC0000022L 2011-02-25 11:38:54
这仍然要求我在访问它们时序列化/反序列化我的值。我想使用本地数据存储,以便我的值只是指向C++对象的指针,避免了I/O开销。 – 2011-02-25 12:14:28
我不太明白。在数据库中,您使用事务以避免部分成功的操作,或另一个客户端由于此类操作而看到不一致的状态。由于您的目标是纯粹的内存映射,因此不需要复杂的多步骤操作,您可能需要回滚。如果你在互斥体中包装访问,那么你是线程安全的。你还想做什么,这样一个互斥保护的std :: map是不够的? – DevSolar 2011-02-25 12:22:43