leveldb概括
一、概括
基本组件:接口方法、参数、数据存储、迭代器(遍历表)、string(自定义的,因为c++自带的拷贝花销大)、锁、状态信息(返回值)
leveldb使用的是小端模式
功能:对外提供四个接口:put\delete\write\get
解决了什么问题:内容持久化、顺序读写
leveldb写流程:
先写log文件---->再把数据更新到内存Memtable中---->当Memtable超过一定大小时变成Imutable---->存放到磁盘中sstable
leveldb读流程:
先去Memtable中查找键值---->(没找到)去imutable中找---->去磁盘中找(leve0/leve1.......)
Manifest:所有涉及sstable的文件的操作都会在这里做相应的记录
Current:记载当前manifest的文件名
log文件:
普通的log文件
WAL log:用来支持事务的完整性
版本概念:
- 旧的文件有一个version1
- 合并完新的版本为version2
- 当v1---->v2的时候,如果有很多请求,v1来服务,当v2生成时会把v1删除,v2来服务
version的数据结构:
- version:常量类型,一个版本中包含有多少文件
- versionEdit:delta类型
- +由versionSet::Builder表示
- =由versionSet::Builder::SaveTo表示
- versionSet:同时保留{A---->B}两个版本
LSM树:
- 非就地更新(lsm):写密集型场景,支持随机写高效(和顺序写一样),把随机写入(日志紧追加方式)--->顺序写,从尾部读
- 日志紧追加的缺点:浪费空间(通过引入GC垃圾回收机制改进),读取延迟高(优化读取效率,引入跳表,达到一定size就sump磁盘,更进一步引入活跃跳跃表/一般跳表来解决不能及时dump的情况)
- 第一层归并后的文件一定没有重复的key
- 为了持久化操作引入wal log,为保证wal log太大引入快照,记录哪些value写入磁盘