当我们不再使用leveldb时,会将 db 这个对象删除。 那在db的析构函数中会做哪些工作?
1 | leveldb::DB *db; |
这篇文章我们一起来看看Open操作。
前面我们已经分析完了Put操作,本篇再来看看Delete操作。 在leveldb中,一次Delete并不是去找到原kv数据然后从数据库中删除,而是将Delete看成一种特殊的Put,标志某个key已经被删除。
上文我们说了leveldb的Put操作。简单来说就是先向log写入一条记录,用于保证本条记录的持久性,然后向memtable插入本条记录。当然这个过程还可能牵涉到compaction,但从宏观上就是这么简单的两步。
今天我们再来谈谈leveldb的Get操作。
前面系列的文章,将leveldb整个系统分成了多个模块讲解,从这篇文章开始,我们讲解leveldb的各个对用户提供的API,将前面的各个组件贯穿起来。这篇文章首先讲解Put操作。
MergingIterator是用于merge sort的iterator。mergeiterator内部有多个有序块,这些有序块分别有一个iterator来遍历,mergeiterator每次访问具有最小key的块。
举个例子:
如果从小到大访问,则首先通过iter2访问块2的0, 接着通过iter1访问块1的1,iter2-块2-2, iter3-块3-3…
TwoLevelIterator是用来访问可用 index域和 data域访问的数据。
如,sstable中的data block和index block。就是分别将index block的block iter和data block的block iter赋值给index iter和data iter.
LevelFileNumIterator用于访问一个level中的file。
其中ke存放的是 指定要访问的file的最大key。 value为16字节数据,用于存放文件序列号和文件size。
原文注释
// An internal iterator. For a given version/level pair, yields
// information about the files in the level. For a given entry, key()
// is the largest key that occurs in the file, and value() is an
// 16-byte value containing the file number and file size, both
// encoded using EncodeFixed64.
LevelFileNumIterator代码很短,直接上所有代码吧。