整数键/值可以存储在LevelDB中吗?

时间:2012-01-10 14:28:49

标签: database key-value leveldb

我搜索了支持整数键和整数值的键值存储。 LevelDB似乎是一个不错的选择,虽然我找不到关于是否支持整数值/键的任何信息

4 个答案:

答案 0 :(得分:11)

你可以在LevelDB中存储几乎任何东西。您通过Slice结构向LevelDB提供不透明的数据片段。这是一个例子:

int intKey = 256;
int intValue = 256*256;

Slice key((char*)&intKey, sizeof(int));
Slice value((char*)&intValue, sizeof(int));

db->Put(leveldb::WriteOptions(), key, value);

这就是它!

然而,需要注意的一点是,尽管在LevelDB中存储整数(作为键和值)通常都很好,但它们将通过BytewiseComparator进行排序,因此您的密钥具有支持逐字节比较。这也意味着如果您依赖于密钥的特定顺序,那么您必须注意系统上的字节序。

您还可以通过Comparator界面编写自己的比较器,这样您就可以替换默认的BytewiseComparator

答案 1 :(得分:1)

在许多情况下,更精细的整数键编码方案是更好的选择。将一个int打包到char *中的双补码表示中(如该问题的另一个答案所示)是一种选择; varint编码是另一个(为小整数节省空间,可以存储没有上限的任意数字)。

答案 2 :(得分:1)

LMDB明确支持整数键(和值,如果你使用的是重复的重复项)。 http://symas.com/mdb

当DB配置为整数键时,键比较函数也要快得多,因为它们可以一次比较一次,而不是一次一个字节,因为默认的面向字符串的比较。

免责声明:我是LMDB的作者。当然,这并不能使事实有所不同。

答案 3 :(得分:0)

为了扩大Link的答案,部分是因为我刚刚在我正在写的这本书的一部分中玩这个确切的事情,你可以看到他/她在下面谈到的BytewiseComparator结果。

另一种方法是将二进制整数翻转为大端格式,以便它们使用默认比较器排序。这使得组合键更容易。 long flippedI = htonl(i);

请注意,LevelDB非常快。我已经在iPhone4上进行了测试,其中包含50,000个带有辅助键的文本键记录,因此大约有100,000个键/值对并且它会一直尖叫。

编写自定义Comparator非常容易,您的数据库将永远使用它,并且仍然使用ByteWiseComparator来获取除数字之外的其他键。最大的问题是决定您的自定义规则涵盖哪些密钥。

一个简单的方法是说所有非整数键的长度超过4个字符,因此假设4字节键是一个整数。这意味着您只需要确保添加尾随空格或其他内容来推动它。这一切都是非常随意的,取决于你,但要记住,你所拥有的只有两条信息是关键内容及其长度。给定密钥没有其他元数据。

使用带有标准BytewiseComparator的数据库

的标准比较器样本的部分结果,其中int键从1开始,上升1到1000
Listing the keys in decimal and hex
 256 ( 100)
 512 ( 200)
 768 ( 300)
   1 (   1)
 257 ( 101)
 513 ( 201)
 769 ( 301)
   2 (   2)
 258 ( 102)
 514 ( 202)
 770 ( 302)
   3 (   3)
 259 ( 103)
 515 ( 203)
 771 ( 303)
...
 254 (  fe)
 510 ( 1fe)
 766 ( 2fe)
 255 (  ff)
 511 ( 1ff)
 767 ( 2ff)