LevelDB:按插入顺序迭代键

时间:2013-05-15 00:18:51

标签: leveldb

在LevelDB中生成自动递增键的好策略是什么?我的目标是能够按照插入顺序迭代键。

3 个答案:

答案 0 :(得分:3)

两种方法:

  1. 使用默认比较器,但使用函数将索引键'1'转换为'000000001',将'20'转换为'000000020',这样leveldb会将它们放在彼此附近;

  2. 自定义一个新的比较器,它将键从类型字符串转换为整数类型,然后你可以比较整数。

  3. 使用上述两种方法中的任何一种,您需要在leveldb中存储一个键值对:current_id ---->整数,或者您可以使用mmap将当前id存储在新文件中。

    然后,使用自己定义的Add()函数,在从关键current_id获取当前id后,您可以插入一个新的键值对:id ---->值,然后您可以将current_id更新为加号。

答案 1 :(得分:1)

由于LevelDB实例一次只能从一个应用程序访问,因此您可以使用64位长并在应用程序中增加它。打开数据库时(以及允许任何写入之前),要查找最后插入的键,可以使用迭代器的Se​​ekToLast()方法。

答案 2 :(得分:1)

正如我在question on integer keys中指出的那样,如果要使用二进制整数,则需要为数据库创建自定义Comparator,否则不会按升序二进制顺序获取它们。这并不难,但你可能忽视了这个需求。

我不太确定你在问什么。如果您要添加的唯一数据是应该将条目记录为日志的键,则为是,只需使用整数键。

但是,如果您要插入密钥,那么您将要搜索其他原因,以便稍后按插入顺序迭代它们,它会变得更复杂。

基本上,您希望为每个键值插入两个键,使用前缀来确定键是“值键”还是“排序键”。例如,假设你有Frank,John,Sally和Amy作为键,并使用前缀~N表示名称键,使用~I表示迭代器键。

数据库如下所示,请注意“Iterator键”没有与之关联的值,因为我们可以从键中获取名称。我已经证明了它好像你使用了两位数的字符串作为数字,而不是使用整数值并且需要一个特殊的比较器。

~I00Frank
~I01John
~I02Sally
~I03Amy
~NAmy => Amy's details
~NFrank => frank's details 
~NJohn => John's details
~NSally => Sally's details