leveldb之示意图

部分图片来源:http://blog.csdn.net/houzengjiang/article/details/7718548
http://www.cnblogs.com/haippy/archive/2011/12/04/2276064.html
http://blog.csdn.net/sparkliang/article/details/8635821

Arena:内存管理,每次根据需求分配一个Block,大小是不固定的,通过vector进行管理
leveldb之示意图_第1张图片

Cache:用来缓存最近使用的.sst文件描述符,所有描述符通过指针形成一个双向链表。通过hash的方式来提高查找速度,为了减少锁开销,根据hash值的高4位将所有描述符分为16部分分别管理
leveldb之示意图_第2张图片

WriteBatch:每次写入和删除记录时,向log文件中写入的最小单元,以8字节sequence和4字节count开始,后面紧接着count条记录。
写入数据时,记录为:kTypeValue key.size() key value.size() value
删除数据时,记录为:kTypeDeletion key.size() key
leveldb之示意图_第3张图片

log:每次向log中写入数据时,都是以 一个固定头部 + 一个WriteBatch 的形式写入的,固定头部共7字节:4字节CRC、2字节length、1字节Type
leveldb之示意图_第4张图片

Memtable:所有记录在Memtable中都是以user_key升序,sequence降序排列的
leveldb之示意图_第5张图片

Manifest:用于保存数据库的运行状态,用于恢复数据库
leveldb之示意图_第6张图片

SSTable: .sst文件,主要分为DataBlock、MetaBlock、MetaIndexBlock、IndexBlock和Footer五部分
leveldb之示意图_第7张图片

DataBlock中的数据部分: 以记录、重启点偏移和重启点总个数的形式存储
leveldb之示意图_第8张图片

DataBlock的记录: 同一个重启点的所有记录都是采用前缀压缩的方式存储的
leveldb之示意图_第9张图片

Footer:固定长度,共28字节:用于记录.sst文件中MetaIndexBlock和IndexBlock的偏移和大小
leveldb之示意图_第10张图片

Version:保存当前版本中所有level的所有.sst文件描述信息(FileMetaData),已经Compaction相关的信息,所有版本通过指针链接成双链表。
leveldb之示意图_第11张图片

VersionSet:用来管理数据库运行时产生的所有版本。其中保存了所有Version形成的双链表的头部,以及.sst文件描述符的缓存table_cache。
leveldb之示意图_第12张图片

DB::Get(): 查找一条记录的流程图
leveldb之示意图_第13张图片

你可能感兴趣的:(leveldb之示意图)