前面我们介绍了leveldb中数据的编码 ,数据在内存中的存储形式(MemTable),数据在磁盘中的存储格式(sstable),以及sstable的形成过程等等。本篇博文将从leveldb用户的角度,详细走一遍leveldb用户写入数据的整个流程。
接口
leveldb对用户提供两个可以写入数据的接口:
Status Write(const WriteOptions& options, WriteBatch* updates);
Status Put(const WriteOptions&, const Slice& key, const Slice& value);
这两个参数的形参不一样,第一个是writebatch,第二个是key-value。第二个比较好理解,第一个是什么意思呢?其实顾命思议,writebatch就是批量写入。后面我们将会看到,其实put函数后面也是要用write接口。我们可以跟下去看一下put函数的实现:
DBImpl::Put -> DB::Put -> DBImpl::Write
我们下面看一下DB:Put中是怎么把key-value加入到writebatch然后调用write函数的:
Status DB::Put(const WriteOptions& opt, const Slice& key, const Slice& value) {
WriteBatch batch;
batch.Put(key, value);//将key-value加入到writebatch中
return Write(opt, &batch);
}
void WriteBatch::Put(const Slice& key, const Slice& value) {
//Count函数计算当前的writebatch中有多少对key-value
//setCount 将当前的键值对数加1,因为这里新加入了一对键值
WriteBatchInternal::SetCount(this, WriteBatchInternal::Count(this) + 1);
//将键值对的type加入到rep末尾
rep_.push_back(static_cast<