【发布时间】:2012-12-17 22:35:29
【问题描述】:
由于以下内容有点长:这里是 tl;dr;版本:是否存在用于快速键和值查找的现有键/值最佳实践,例如具有持久索引的基于哈希的集合?
我对键值数据库领域很感兴趣,但至今未能弄清楚如何有效地实现以下用例:
假设我们想要序列化一些数据并通过一个持久的、唯一的整数索引在其他地方引用它们。例如:Key = unsigned int, Value = MyData。
数据库应具有快速键查找并确保 MyData 是唯一的。
现在,当我在数据库中插入一个新值时,我可以为其分配一个新的索引键,例如数据库的当前大小或为了防止删除项目后发生冲突,我可以在外部保留一些计数器。
但是我如何确保不会将相同的 MyData 值插入到我的数据库中?到目前为止,在我看来,键值数据库似乎无法有效地实现这一点 - 这是正确的吗? IE。我确实不想要遍历整个数据库只是为了确保 MyData 值不在其中...
那么,实现这一点的最佳做法是什么?
对于背景:我在 KDevelop 上工作,我们将上述内容用于我们的代码分析缓存。我们实际上有上述用例1 的自定义实现。如果您对内部结构感兴趣,请搜索 Bucket 和 ItemRepository,并查看 2 了解 ItemRepository 的示例用法。
但您可能会同意,这段代码很难理解,因此也很难维护。我想将它的性能与可能导致代码更简单的替代解决方案进行比较——但前提是它不会导致严重的性能损失。考虑到围绕 OpenLDAP MDB、Kyoto Cabinet 和 LevelDB 等键值存储性能的炒作,这就是我想开始的地方。
我们在 KDevelop 中拥有的——据我所知——基本上是一种混合的磁盘/内存哈希映射,它会定期保存到磁盘(这当然会导致严重的数据损坏,以防万一崩溃等)。项目根据它们的散列值存储在一个位置,只要散列函数速度快,这当然也允许相对快速的值查找。增加的转折是您还可以获得某种持久性数据库索引,可用于非常有效地查找项目。
所以 - 长话短说 - 如何使用诸如 LevelDB、Kyoto Cabinet、OpenLDAP MDB 之类的键/值数据库来做到这一点 - 你能说出它的名字吗?
【问题讨论】:
标签: indexing key-value openldap leveldb kyotocabinet