leveldb之示意图

本文详细介绍了LevelDB的内部结构,包括Arena内存管理、Cache缓存机制、WriteBatch的使用方式、log文件的写入格式、Memtable的数据组织形式、SSTable的组成结构以及Version和VersionSet的作用。这些组件共同构成了LevelDB高效稳定的数据存储解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

部分图片来源: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进行管理
Arena

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

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

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

Memtable:所有记录在Memtable中都是以user_key升序,sequence降序排列的
Memtable

Manifest:用于保存数据库的运行状态,用于恢复数据库
Manifest

SSTable: .sst文件,主要分为DataBlock、MetaBlock、MetaIndexBlock、IndexBlock和Footer五部分
SSTable

DataBlock中的数据部分: 以记录、重启点偏移和重启点总个数的形式存储
DataBlock中的数据部分

DataBlock的记录: 同一个重启点的所有记录都是采用前缀压缩的方式存储的
DataBlock的记录

Footer:固定长度,共28字节:用于记录.sst文件中MetaIndexBlock和IndexBlock的偏移和大小
Footer:固定长度,共28字节

Version:保存当前版本中所有level的所有.sst文件描述信息(FileMetaData),已经Compaction相关的信息,所有版本通过指针链接成双链表。
这里写图片描述

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

DB::Get(): 查找一条记录的流程图
DB::Get()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值