2

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

4

3 回答 3

3

两种方法:

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

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

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

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

于 2013-08-21T03:35:06.637 回答
1

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

于 2013-08-11T01:08:13.330 回答
1

正如我刚刚在关于整数键的问题中指出的那样,如果您想使用二进制整数,您需要为数据库创建一个自定义比较器,否则您不会以二进制升序排列它们。这并不难,但您可能忽略了这一需求。

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

但是,如果您要插入键,您将搜索其他一些原因加上您想稍后按插入顺序迭代它们,它会变得有点复杂。

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

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

~I00Frank
~I01John
~I02Sally
~I03Amy
~NAmy => Amy's details
~NFrank => frank's details 
~NJohn => John's details
~NSally => Sally's details
于 2013-08-13T18:28:38.847 回答