leveldb学习:Version

leveldb通过Version进行版本控制,每个Version包含所有级别的sstable文件信息。compact进程负责memtable持久化和各level的sstable均衡。VersionEdit记录版本变化并保存在MANIFEST文件中。Version具有引用计数,用于处理读写竞争,当引用计数为0且非当前版本时,Version及其对应的sstable可删除。LevelFileNumIterator和Get函数分别用于查找和查询操作,Get函数根据level-0和level-n的不同情况进行处理,并更新查找统计信息。
摘要由CSDN通过智能技术生成

到此为止,基本上leveldb的主要功能组件都已经分析完了,下面如何把它们组合在一起形成一个高效稳定的数据库,这就是DBimpl类和compact进程的工作。

  • campact进程

为了均衡读写的效率,sstable文件分层次(level)管理,db预定义了最大的level值。compact负责将memtable持久化成sstable,以及均衡整个db中各level的sstable。

  • 版本控制

当执行一次compaction后,Leveldb将在当前版本基础上创建一个新版本,当前版本就变成了历史版本。在leveldb中,Version就代表了一个版本,它包括当前磁盘及内存中的所有文件信息。VersionSet是所有Version的集合,这是个version的管理机构。在所有的version中,只有一个是CURRENT。
VersionEdit 表示Version之间的变化,相当于delta 增量,表示有增加了多少文件,删除了文件。
VersionEdit会保存到MANIFEST文件中,当做数据恢复时就会从MANIFEST文件中读出来重建数据。

这两部分具体的操作还是在源码中细讲吧。

static double MaxBytesForLevel(int level) {
  // Note: the result for level zero is not really used since we set
  // the level-0 compaction threshold based on number of files.
  double result = 10 * 1048576.0;  // Result for both level-0 and level-1
  while (level > 1) {
    result *= 10;
    level--;
  }
  return result;
}
static uint64_t MaxFileSizeForLevel(int level) {
  return kTargetFileSize;  // We could vary per level to reduce number of files?
}

关于不同level中sstabl

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值