说明
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;
|
代码的输出结果居然为:
我也是刚开始阅读源码,还没有搞清楚为什么是这个结果,这里暂时先mark下。