1. 前言
.leveldb包含三个操作,Put插入item、Get根据key获取item、Delete删除特定的item,但是leveldb所有的写相关操作都是追加,Delete相当于一个Put(key, kdeletetype)操作,向数据库中插入一个delete标志,标明该key对应的数据已经删除了。本文章使用的代码为leveldb-1.12.
2. 本文分析内容安排
- leveldb Delete从操作原理介绍
- 对leveldb源代码的更改
- 恢复代码
3. leveldb Delete操作原理介绍
3.1 Iterator迭代器
leveldb的迭代器实现比较复杂,因为leveldb的数据存在mutable、immutable和sstable中,所以其迭代器由这三者组成,因为只有sstable是实际存储在磁盘中的数据,其他两个是存储在内存中的,所以我们只讨论sstable的iterator。另外,因为leveldb只支持append写操作,同一个key在数据库中会对应多个版本号的数据,所以在实现上leveldb提供给用户的Iterator是基于key的,其Next()函数返回下一个不同的key的item;同时,其内部的iter_在key不同、同一个key但版本号不同是都是不同的,所以其Next()函数返回的是同一个key下一个seq的item或者是下一个key的数据。
3.2 Get获取数据过程
leveldb在执行Get(key, &value)操作取数据时,会首先从mutable中读取、其次immutable,最后读sstable,这里我们只涉及读取sstable中的数据。其在读取到的数据type为value时返回该value值,读到的type为delete值返回空。
4. 对leveldb源代码的更改
这里主要分为三步,第一步找出删除的item对应的key,第二步获取到该key在delete前存在磁盘中的数据,第三步使用获取到的数据再执行一个Put操作。其中,前两步都需要更改leveldb的源码,在此节介绍;第三步仅在恢复代码中实现,下节介绍。