C LMDB操作方法

C LMDB操作方法,c,database,lmdb,C,Database,Lmdb,我刚开始用LMDB替换一些SQL表,LMDB是用C()实现的基本键值存储 在移植过程中,我遇到了一些理论问题: DB使用游标而不是键入的键,我假设这是因为键可以根据需求(blob)进行更改,是这样吗 LMDB将数据库映射到内存中,并且仅在事务提交时才同步到文件。如何在多进程环境中保持完整性?内存是否在所有用户之间共享 另外,当我试图从数据库中删除一个项目时(使用mdb_del),它没有删除它,只是将它标记为已删除。所以看起来DB文件不会变小,因为没有内存重用。这种方法的好处是什么 也许有一个

我刚开始用LMDB替换一些SQL表,LMDB是用C()实现的基本键值存储

在移植过程中,我遇到了一些理论问题:

  • DB使用游标而不是键入的键,我假设这是因为键可以根据需求(blob)进行更改,是这样吗

  • LMDB将数据库映射到内存中,并且仅在事务提交时才同步到文件。如何在多进程环境中保持完整性?内存是否在所有用户之间共享

  • 另外,当我试图从数据库中删除一个项目时(使用
    mdb_del
    ),它没有删除它,只是将它标记为已删除。所以看起来DB文件不会变小,因为没有内存重用。这种方法的好处是什么

    也许有一个来源详细解释了它是如何工作的

  • 您可以通过键“where key=k”进行搜索。光标用于查找第一个、最后一个、下一个或上一个键。光标还允许您搜索“where Key>=k”。(我觉得它很有用)

  • LMDB支持一个编写器和多个读者。它适合我(VisualStudio使用lmdb.v140)。我发现唯一一个能够做到这一点的无服务器数据库

  • 不适用


  • Lmdb有趣的无锁数据库垃圾收集方法在Lmdb站点链接的一篇文章中作了简要介绍。基本上,立即回收已删除空间的好处是节省大量时间。(我不知道更多;我只是读了你链接到的报纸:-)至于第3点,将内容标记为免费,而不是立即发布,这几乎不是LMDB的独有功能。。。在大多数情况下,几乎所有数据库、文件系统和内存分配器都会这样做,回收标记为已删除的项以获取新数据。@MatteoItalia,谢谢你的评论,我认为这是因为数据库文件永远不会变小。也许您可以分享关于第二个问题的一些见解,即DB如何允许在事务提交时不使用fsync all transaction的情况下进行多进程访问。它是否保存所有最近操作的共享内存?它们是否会在突然重新启动时丢失(即使在这种情况下,数据库仍然是一致的)?@rici,你能给我发一个这个文档的链接吗,我自己找不到它。@osxUser:文件不会变小,因为页面实际上没有被释放,但是,只要它们被标记为完全没有有效数据并且添加了新数据,它们就会被回收用于新数据。另外,不要相信我的话(我已经很久没有看LMDB了),但是IIRC整个DB只是一个映射在内存中的文件,在访问它的所有进程之间。操作系统保证所有进程都能正确地看到相同的内容。感谢您的帮助。也许您可以澄清关于数据一致性的另一点。我知道有3种操作模式。一个使用fsync在每次事务时都会保持笔直,另一个则自愿使用fsync(这可以提高性能,降低从突然重启中恢复的成本)。第三种混合模式是DB fsync在另一个事务到达之前完成最后一个事务,这意味着在恢复过程中,您可能会丢失最后一个事务。也许您可以验证我的解释,让我知道如何在每种模式下配置DB。我只是使用默认行为。我猜这意味着每次提交时都会发生fsync。但您可以或多或少地调用commit,这与“fsync自愿”类似吗?最后,如果您将它与基于服务器的数据库进行比较,该数据库在每次访问时(无论是否提交)都会使用网络RTT,我认为即使您非常频繁地提交,LMDB也会快得多。