说明

levelDB 是google开源的一套key-value存储引擎。关于引擎的介绍,这里就不说了,官方已经说明的很清楚了,这里只记录一些在阅读源码中的内容和问题。

Slice头文件:

这里只是简单阅读了下slice的头文件,slice是单独的头文件,不包含实现文件。文件内容比较简单,总体来说就是对string类型或const char * 类型进行了封装,封装成对象类型,用于在DB类中调用。但slice中并未对传入的string类型进行内存拷贝,或做copy-on-write。所以使用中还是有些要注意的。

例如如下测试代码:

1
2
3
4
5
std::string string1 = "nodata";
leveldb::Slice slice = string1;
string1 = "bb";
slice.remove_prefix(2);
std::cout << slice.data() << std::endl;

此段代码的输出为空字符,所以在操作slice数据的时候最好要采用常量形式,避免修改。

同时,对于数据操作,slice的使用时同样需要注意,例如如下测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
leveldb::DB         *db;
leveldb::Options options;
options.create_if_missing = true;

leveldb::Status status = leveldb::DB::Open(options, "/tmp/testdb", &db);
assert(status.ok());

std::string key1 = "key1";
std::string value = "value";
leveldb::Slice slice = value;
status = db->Put(leveldb::WriteOptions(), key1, slice);

value = "bb";
std::string key2 = "key2";
status = db->Put(leveldb::WriteOptions(), key2, slice);

std::string result1;
db->Get(leveldb::ReadOptions(), key1, &result1);
std::cout<<result1<<std::endl;

std::string result2;
db->Get(leveldb::ReadOptions(), key2, &result2);
std::cout<<result2<<std::endl;
return 0;

代码的输出结果居然为:

1
2
value
bbue

我也是刚开始阅读源码,还没有搞清楚为什么是这个结果,这里暂时先mark下。