LevelDB源码分析4-Memtable(2) Memtable(2)这篇文章我们开始剖析Memtable 的代码实现和核心数据结构SkipList 相较于传统的链表,跳表采取空间换时间的策略,建立多层索引,实现了查找和插入都只需要logn级别的优化。 SkipList 的结构如下所示: SkipList的结构LevelDB 跳表代码上,主要涉及 C++11 中 atomic 标准库中新支持的几种 memory order,规定了一些 2024-02-26 数据库 > LevelDB源码分析 #数据库 #LevelDB源码分析
LevelDB源码分析5-BlockBuilder BlockBuilder在讲解sstable之前,我们先来看一下Block结构体的内容。 Block由一条条的data_entry(前缀压缩),以及重启点数组,重启点数组的大小还有5字节的crc32与一个type组成。所以我们解析一个block是很容易的。首先由于最后5个字节是crc32和type,所以可以找到重启点数组大小从而定位到重启点数组的开始位置,进而每一个data_entry都可以解析出 2024-02-26 数据库 > LevelDB源码分析 #数据库 #LevelDB源码分析
LevelDB源码分析3-Memtable(1) Memtable(1)对应文件:memtable.h和memtable.cc 每个 LevelDB 实例最多会维护两个 MemTable: mem_ 和 imm_。mem_ 可以读写,imm_ 只读。 12MemTable* mem_;MemTable* imm_ GUARDED_BY(mutex_); // Memtable being compacted LevelDB 的 MemTable 2024-02-26 数据库 > LevelDB源码分析 #数据库 #LevelDB源码分析
LevelDB源码分析2-编码 编码Leveldb使用了很多VarInt型编码,典型的如后面将涉及到的各种key。其中的编码、解码函数分为VarInt和FixedInt两种。int32和int64操作都是类似的。 Encode FixedInt编码:直接把32位整数存储在内存中。 小端:低位放到低字节地址中,高位放在高字节地址中 1234567891011void EncodeFixed32(char* buf, uint3 2024-02-26 数据库 > LevelDB源码分析 #数据库 #LevelDB源码分析
LevelDB源码分析18-Recover Manifest文件在介绍Recover机制前,我们先要看一下leveldb中的Manifest 文件。 我们知道,每次进行Compaction生成或删除SSTable文件时,都会生成一个新的版本。LevelDB 采用了增量式的存储方式,用 VersionEdit 记录每一个 Version 对上一个 Version 的变化情况。 Manifest 文件专用于记录版本信息。一个 Manifest 2024-02-26 数据库 > LevelDB源码分析 #数据库 #LevelDB源码分析
LevelDB源码分析17-WAL机制 预写日志(WAL)背景LevelDB每次写key-value不会直接写到文件中,而是先暂存在Memtable中,Memtable写满后再写到文件中。如果发生故障(比如宕机),保存在Memtable中的key-value就会全部丢失(内存是易失性存储)。所以为了保证数据的原子性和持久性,每次写key-value要预写日志,日志落盘后才会把key-value插入Memtable。日志文件和Memtab 2024-02-26 数据库 > LevelDB源码分析 #数据库 #LevelDB源码分析
LevelDB源码分析16-Put&&Delete&&Get Put && Delete && Get这篇文章主要介绍一下leveldb中Put 和Delete 的接口。而Write接口用来批量执行Put或Delete操作,在同一批(即同一个WriteBatch)中的操作,其插入的entry的SequenceNumber相同。 1234567891011Status DB::Put(const WriteOptions& 2024-02-26 数据库 > LevelDB源码分析 #数据库 #LevelDB源码分析
LevelDB源码分析14-快照Snapshot Snapshotsnapshot,即快照,赋予了使用者查找在过去某一个瞬间数据库状态的能力:在那一时刻,整个 leveldb 有哪些数据,什么版本。 leveldb 会冗余地存储很多旧版本的数据。我们有可能误删了数据, 或者想追踪数据的变化历史,这时快照功能就十分有用了。 实现快照功能有以下两个主要问题: 前面说过,应该冗余存储旧版本数据。那么应该保留多老的数据呢? 联想到 leveldb 中任 2024-02-26 数据库 > LevelDB源码分析 #数据库 #LevelDB源码分析
LevelDB源码分析15-版本控制 本讲内容这篇文章主要介绍leveldb中的MVCC机制,leveldb是如何进行读读并发,读写并发以及快照读的。 LevelDB的用户可以通过其提供的接口要求其保留一定时间之前的快照,在用户释放快照前,该快照创建时LevelDB中存在的数据就不会被释放。这里主要通过Ref 和UnRef 机制实现。引用计数为0的版本可以删除,同样引用计数为0的文件也可以删除,不同的版本之间可能会有重叠的文件。 想要 2024-02-26 数据库 > LevelDB源码分析 #数据库 #LevelDB源码分析
LevelDB源码分析13-迭代器 我们已经介绍了leveldb中基本所有组件的结构,接下来我们应该设计迭代器用来访问这些基本的组件。 本文将对LevelDB中迭代器Iterator的体系进行介绍,旨在梳理LevelDB中各种迭代器的功能与使用场景,对迭代器的实现介绍较少。迭代器的实现细节其实相对并不难。 IteratorsLevelDB中,既有直接在集合上的基本迭代器,也有对一个迭代器进行封装来解析更复杂数据的迭代器,还有多个迭代 2024-02-26 数据库 > LevelDB源码分析 #数据库 #LevelDB源码分析