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



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

您几乎可以在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

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

为了进一步了解林克的答案,部分原因是我刚刚在写这本书时使用了这个确切的东西,你可以在下面看到他/她谈到的BytewiseComparator结果。

另一种方法是将二进制整数翻转为big-endian格式,这样它们就可以使用默认比较器进行排序。这样可以更容易地编写关键帧。long flippedI = htonl(i);

请注意,LevelDB速度非常快。我在一台iPhone4上做了测试,它有50000条带副密钥的文本键记录,所以大约有100000对密钥/值对,它会发出刺耳的声音。

编写一个自定义比较器非常容易,它将永远被您的数据库使用,并且仍然使用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)

LMDB明确支持整数键(如果使用排序重复项,则支持值)。http://symas.com/mdb

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

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

相关内容

  • 没有找到相关文章

最新更新