Talent Plan TinyKV Project1 StandaloneKV
复制代码
Storage 底层由 badger(类似 LevelDB 或 RocksDB 的存储引擎)支持,StandAl 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 oneStorage 即 badger 的简单封装。
目前不需要考虑 kvrpcpb.Context 的涵义。
一些提示。
使用 badger.Txn 来实现 Reader()函数,即 badger 提供的事务支持。
badger 不支持 Column Family,engine_util 提供了一系列函数,利用前缀来实现 Column Family,使用它们来实现 Write()函数。
使用 Connor1996/badger 而不是 dgraph-io/badger。
使用 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
评论