先列出来参考 资料:
看这篇翻译:http://duanple.blog.163.com/blog/static/70971767201171705113636/
Leveldb源码分析4 Slice:http://www.kuqin.com/database/20110919/265041.html
Slice.h源码:http://www.oschina.net/code/explore/leveldb/include/leveldb/slice.h
1 相比返回string,返回Slice的开销会小的多(没有拷贝,Slice中没有实际数据,只有指向数据的指针,开销低)。 2 leveldb允许key和value包含'\0',不能返回以null结尾的c风格字符串。
对于上面两点,第二点 可以包括\0?? 这就奇怪了,字符串就是根据\0判断的。那么 如果二进制的话,就有太多的\0了。
于是 看到源码分析关于 Slice的构造函数中
// Create an empty slice. Slice() : data_(""), size_(0) { } // Create a slice that refers to data[0,n-1]. Slice(const char* data, size_t n) : data_(data), size_(n) { } // Create a slice that refers to the contents of "s" Slice(const std::string& s) : data_(s.data()), size_(s.size()) { } // Create a slice that refers to s[0,strlen(s)-1] Slice(const char* s) : data_(s), size_(strlen(s)) { }
第二个 可以指定 一个 n,和一个char * 。
我们的二进制 一般就是 char * 类型的,只要可以指定n,那么 其实就可以将二进制 放入 Slice中,也就可以放入 leveldb中了。
或许 我应该尽快 写一个例子 来验证一切。。。。。。
TODO:leveldb 通过Slice保存 二进制 的例子。