leveldb源码剖析--数据写入(DBImpl::Write)

本文深入剖析leveldb数据写入过程,从用户角度出发,详细讲解DBImpl::Write接口及其实现,涉及Writebatch、内存MemTable、多线程同步等关键环节,阐述序列号(sequence number)的作用和生产者消费者模型在leveldb中的应用。
摘要由CSDN通过智能技术生成

前面我们介绍了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<
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值