leveldb的文件组成:
- memtable
- immemtable
- log(journal)
- sstable
- manifest
- current
memtable分析
leveldb中的内存数据库,维护有序的key-value对,底层利用跳表实现,读写的时间复杂度为O(log N)
1 | note: 为什么不选择红黑树呢,(跳表 VS 红黑树) |
编码方式
由于内存数据库本质是kv集合,数据项按照key进行排序(方便查找),因此键值得编码规则尤为关键。
1 | 内存数据库中,key称为internalKey;[ db/dbformat.h ] |
1 | class MemTable{ |
leveldb compaction
- compaction的时机:
- 后台线程的定期任务(DB::open()中impl->MaybeScheduleCompaction())
- 正常读写流程中判定系统达到一个临界状态,此时必须进行Compaction
- leveldb中的compaction有两种:
- minor compaction:将immemtable数据写回到Disk的过程;
- major compaction:将level_N的某个文件和level_N-1中的几个文件合并的过程;
//用户add key/value过程中可能触发compaction
Status DBImpl::MakeRoomForWrite(bool force)}{
mutex_.AssertHeld();
assert(!writer_.empty());
......
MaybeScheduleCompaction();
}
void DBImpl::MaybeScheduleCompaction(){
......
background_compaction_scheduled_ = true;
env_->Schedule(&DBImpl::BGWork, this); //调度, call DBImpl::BGWork
}
void DBImpl::BGWork(void* db){
reinterpret_cast<DBImpl*> (db)->BackgroundCall();
}
void DBImpl::BackgroundCall(){
......
BackgroundCompaction();
}
void DBImpl::BackgroundCompaction(){
......
CompactMemTable();
}
Status DBImpl::WriteLevel0Table(MemTable* mem, VersionEdit* edit, Version* base){
//构建SSTable
s = BuildTable(dbname_, env, options_, table_cache, iter, &meta);
//edit里面添加信息
edit->AddFile(level, meta.number, meta.file_size, meta_smallest, metalargest);
}
leveldb版本管理
//leveldb: