所以我们可以得出结论是最终的SkipList中使用的Comparator就是在Open数据库的时候传入的参数Option中的成员变量comparator,所以我们在实现自己的Comparator的时候只有仿照BytewiseComparatorImpl实现一个,然后通过option的方式传递给leveldb即可。 最后我们整理一下思路: 1. SkipList中使用的KeyComparator仅仅是对InternalKeyComparato...
LevelDB没有规定比较的规则,只是定义了一个Comparator接口,用户可以提供自己的规则实现这个接口。 // include/leveldb/comparator.h class LEVELDB_EXPORT Comparator { public: virtual ~Comparator(); virtual int Compare(const Slice& a, const Slice& b) const = 0; virtual const char* Name() const = 0...
程序退出的时候,singleton 对象本身会被析构销毁掉,但是 NoDestructor 没有在其析构函数中添加任何逻辑来析构 instance_storage_ 中构造的对象,因此 instance_storage_ 中的 BytewiseComparatorImpl 对象永远不会被析构。 const Comparator* BytewiseComparator() { static NoDestructor<BytewiseComparatorImpl> singleton; ...
LevelDB是按key排序后进行存储,因此必然少不了对key的比较。在源码中,key的比较主要是基于Comparator这个接口实现的,Comparator是一个纯虚类,具体定义如下:class Comparator{ public: virtual ~Comparator(); virtual int Compare(const Slice &a, const Slice& b) const = 0; virtual const char* Name() const...
LEVELDB_EXPORT const Comparator* BytewiseComparator(); 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 2.线程安全的单例模式 BytewiseComparator在comparator.cc中实现如下: const Comparator* BytewiseComparator() { static NoDestructor<BytewiseComparatorImpl> singleton; ...
代码位置【include/leveldb/comparator.h】【util/comparator.cc】 比较器里面包含了抽象类接口,同时提供了BytewiseComparatorImpl与InternalKeyComparator。 今天我们主要分析抽象类与BytewiseComparatorImpl以及相关无析构类。 1.抽象类 我们把注释删除掉之后,就只剩下下面的核心内容。
TwoPartComparator cmp; leveldb::DB* db; leveldb::Options options; options.create_if_missing = true; options.comparator = &cmp; leveldb::Status status = leveldb::DB::Open(options, "/tmp/testdb", &db); ... 12.向后兼容性 比较器 Name() 方法返回的结果在创建数据库时会被绑定到数据库...
options.comparator = &cmp; leveldb::Status status = leveldb::DB::Open(options, "/tmp/testdb", &db); ... 1. 2. 3. 4. 5. 6. 7. 后向兼容性 Backwards compatibility 比较器的Name方法的结果在创建时附加到数据库,并在每次后续数据库打开时检查。 如果Name更改,leveldb::DB::Open调用将失败...
comparator_:比较器的名称,这个在创建 LevelDB 的时候就确定了,以后都不能修改。 log_number_:最小的有效 log number。小于 log_numbers_ 的 log 文件都可以删除。 prev_log_number_:已经废弃,代码保留是为了兼容旧版本的 LevelDB。 next_file_number_:下一个文件的编号 。
Comparator define a proper subclass of leveldb::Comparator that expresses your rule. classTwoPartComparator:public leveldb::Comparator { public:intCompare(constleveldb::Slice& a,constleveldb::Slice& b)const{inta1, a2, b1, b2; ParseKey(a, &a1, &a2); ...