写点什么

Talent Plan TinyKV Project1 StandaloneKV

  • 2022 年 5 月 13 日
  • 本文字数:1173 字

    阅读完需:约 4 分钟

复制代码


Storage 底层由 badger(类似 LevelDB 或 RocksDB 的存储引擎)支持,StandAl 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 oneStorage 即 badger 的简单封装。


目前不需要考虑 kvrpcpb.Context 的涵义。


一些提示。


  1. 使用 badger.Txn 来实现 Reader()函数,即 badger 提供的事务支持。

  2. badger 不支持 Column Family,engine_util 提供了一系列函数,利用前缀来实现 Column Family,使用它们来实现 Write()函数。

  3. 使用 Connor1996/badger 而不是 dgraph-io/badger。

  4. 使用 Discard()关闭 badger.Txn,这之前需要关闭所有迭代器。


最后就是基于 Storage 实现 RawGet/RawScan/RawPut/RawDelete,完成后通过 make project1 进行测试。


StandAloneStorage




engine_util 封装了 badger 的接口,StandAloneStorage 就是要在 engine_util 的基础上再封装一层。因此 StandAloneStorage 结构也很简单。


type StandAloneStorage struct {


engine *engine_util.Engines


}


复制代码


StandAloneStorage 为抽象类 Storage 的具体实现,因此需要实现 Write 和 Reader 两个函数,函数签名如下。


func (s *StandAloneStorage) Write(ctx *kvrpcpb.Context, batch []storage.Modify) error


func (s *StandAloneStorage) Reader(ctx *kvrpcpb.Context) (storage.StorageReader, error)


复制代码


Project1 中,还用不到 kvrpcpb.Context,storage.Modify 对应 Put 或 Delete 两个写操作,storage.StorageReader 同样是一个抽象类。

Reader

type StorageReader interface {


GetCF(cf string, key []byte) ([]byte, error)


IterCF(cf string) engine_util.DBIterator


Close()


}


复制代码


可以看到 StorageReader 的两个函数,屏蔽了事务,简化了接口。实现 StorageReader 需要用到 engine_util 提供的 GetCFFromTxn 和 NewCFIterator 两个函数。


func GetCFFromTxn(txn *badger.Txn, cf string, key []byte) (val []byte, err error)


func NewCFIterator(cf string, txn *badger.Txn) *BadgerIterator


复制代码


获取 badger.Txn 的函数 engine_util 并未给出,需要直接调用 badger.DB.NewTransaction 函数。


func (db *DB) NewTransaction(update bool) *Txn


复制代码


update 为真表示 Put/Delete 两个写操作,为假表示 Get/Scan 两个读操作。

Write

type Modify struct {


Data interface{}


}


type Put struct {


Key []byte


Value []byte


Cf string


}


type Delete struct {


Key []byte


Cf string


}


复制代码


Modify 表示一个 Put/Delete 操作,Write 中通过断言确定是 Put 还是 Delete,进而调用 engine_util 提供的 PutCF 和 DeleteCF 两个函数。


func PutCF(engine *badger.DB, cf string, key []byte, val []byte) error


func DeleteCF(engine *badger.DB, cf string, key []byte) error


复制代码


其实这两个函数内部实现依旧是用了事务的,相比于 Reader,Write 对事务的屏蔽并没有让我们自己实现。


Server




用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
Talent Plan TinyKV Project1 StandaloneKV_Java_爱好编程进阶_InfoQ写作社区