leveldb数据库的Put操作源码

23 篇文章 1 订阅
7 篇文章 0 订阅

之前的leveldb总结分享中说到了三个关键部分,数据的Put,Get,compaction。其中put操作实现了数据的增删改功能,Get操作实现了数据的查功能。本文从源码角度说明下put操作的相关流程。

put接口位于leveldb的db_write.go文件中,代码如下

func (db *DB) Put(key, value []byte, wo *opt.WriteOptions) error {`

​    return db.putRec(keyTypeVal, key, value, wo)

}

Put接口下面就是Delete接口,代码如下

 func (db *DB) Delete(key []byte, wo *opt.WriteOptions) error {
    ​    return db.putRec(keyTypeDel, key, nil, wo)
    }

其中put接口与delete接口都是通过调用db.putrec函数实现的,不同的地方在于,put操作的数据属性为keyTypeVal,表示数据有效,是插入数据,delete操作的数据属性为keyTypeDel,表示数据无效,是删除数据。接下来看db.putRec是如何实现的。下面代码只保留了流程关键部分。

func (db *DB) putRec(kt keyType, key, value []byte, wo *opt.WriteOptions) error 

   ......省略代码.......

​    batch := db.batchPool.Get().(*Batch)

​    batch.Reset()

​    batch.appendRec(kt, key, value)

​    return db.writeLocked(batch, batch, merge, sync)

}

将keytype,key,value放入batch中,调用db.writeLocked函数

func (db *DB) writeLocked(batch, ourBatch *Batch, merge, sync bool) error {

​    mdb, mdbFree, err := db.flush(batch.internalLen)

​     ............省略代码...........

​    if err := db.writeJournal(batches, seq, sync); err != nil {

​        db.unlockWrite(overflow, merged, err)

​        return err

​    }

​    // Put batches.

​    for _, batch := range batches {

​        if err := batch.putMem(seq, mdb.DB); err != nil {

​            panic(err)

​        }

​        seq += uint64(batch.Len())

​    }

   ...................

​    db.unlockWrite(overflow, merged, nil)

​    return nil

}

从上述代码可以看出关键流程只有3步,flush,writeJournal,putMem。

其中flush主要是为了申请内存用于存储数据,

writeJournal主要是为了将数据写入log文件,用于系统异常时恢复数据,避免数据丢失。

putMem则是将数据写入flush申请的内存。

至此,一次写入操作就完成了。至于后面将内存的数据写入到磁盘上,就属于memcomcaption的地盘了。

leveldb的Put操作原理是很简单的,将数据写入log,因为是顺序追加,还是很快的,将数据写入内存那就更快了。这也就是leveldb写操作快的原因。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值