LevelDB源码解析(14) 写操作之Write主流程

leveldb对外提供的写入接口是Put,Put的实现如下: Status DB::Put(const WriteOptions &opt, const Slice &key, const Slice &value) { WriteBatch batch; batch.Put(key, value); return Write(opt, &batch); } WriteBatch是一个比较简单的类,只有一个string类型的成员变量rep_。提供了插入、删除、遍历等操作,详细实现可以参考LevelDB源码解析(5)……

阅读全文

LevelDB源码解析(12) Memtable落盘

背景 LevelDB源码解析(4) MemTable介绍了Memtable,LevelDB会先把key-value插入到MemTable中。如果MemTable写满了,就会新建一个MemTable进行写入。旧的Memtablex会落盘。一个Memtable会产……

阅读全文

LevelDB源码解析(11) SST文件结构

背景 前面我们逐渐深入的介绍了LevelDB从插入key-value到落盘的整个过程,感兴趣的读者可以移步相关文章: LevelDB源码解析(4) MemTable LevelDB源码解析(5) WriteBatch LevelDB源码解析(6) 写任务(WriterBatch)合并 LevelDB源码……

阅读全文

LevelDB源码解析(9) FilterBlockBuilder

背景 Filter block为SST中一个区块,filter block由多个filter组成,每个data block对应一个filter(但是一个filter可能对应多个data block)。LevelDB在进入data block中查找前会先检查filter,如果fi……

阅读全文

LevelDB源码解析(8) BlockBuilder

背景 一个SST文件由5个区块组成,其中三个区块都是由BlockBuilder构建的,所以在讲SST文件的构建之前,先讲一下BlockBuilder。BlockBuilder接受一组key-value,将其序列化到buffer中,buffer的数据就是要写入……

阅读全文

LevelDB源码解析(7) 预写日志(WAL)

背景 LevelDB每次写key-value不会直接写到文件中,而是先暂存在Memtable中,Memtable写满后再写到文件中。如果发生故障(比如宕机),保存在Memtable中的key-value就会全部丢失。所以为了保证数据的原子性和持久性,每次写k……

阅读全文

LevelDB源码解析(6) 写任务(WriterBatch)合并

背景 写任务合并是由函数BuildBatchGroup来完成的,BuildBatchGroup会把任务队列writers_中若干个Writer的数据合并到一起,从而减少磁盘写次数,提高写性能。虽然每次写入的时候是往Memtable里写,但是为了在故障发生时保……

阅读全文