【每日一库】类似 database/sql 的抽象层,但用于 Key-Value 存储

polaris · · 2922 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

标准库包 database/sql 不依赖具体的数据库,这是在数据库之上的抽象,在具体使用时,只需要引入具体数据库的驱动即可,而且官方也没有提供具体数据库的驱动,有社区自己实现。如果你有一个关系数据库,根据约定,你也可以实现一个满足 database/sql 对数据驱动库要求的驱动。 [goukv](https://github.com/alash3al/goukv) 这个库受到这种设计思路的启发,用于满足各种 Key-Value 数据库。我们知道,目前 Key-Value 的数据缓存或存储系统还是挺多的,我们可以在使用哪个时,引入哪个。但如果一旦想要替换,可能要涉及到不少修改,而且接口也可能很不一样。这个库就能解决此类问题。 ## 项目信息 地址:https://github.com/alash3al/goukv 开源时间:2020-02-24 项目描述:goukv 是基于 golang 的键值存储的抽象层,可以轻松添加任何后端提供程序。 虽然刚开源,但版本是 v1.0.0,作者认为是可以稳定线上可用版本。 ## 使用 作者提供了两个 Provider:badgerdb 和 golveldb 。我们可以使用其提供的驱动进行使用演示。 ```go package main import ( "time" "fmt" "github.com/alash3al/goukv" _ "github.com/alash3al/goukv/providers/goleveldb" ) func main() { db, err := goukv.Open("goleveldb", map[string]interface{}{ "path": "./db", }) if err != nil { panic(err.Error()) } defer db.Close() db.Put(goukv.Entry{ Key: []byte("k1"), Value: []byte("v1"), TTL: time.Second * 10, }) fmt.Println(db.Get([]byte("k1"))) } ``` 这个库的核心在于 goukv.Provider 接口,具体的 Provider 只需要实现该接口即可。从上面的代码可以看出,在使用时,也是通过获得该接口的一个具体实现,然后进行相关的操作。接口定义如下: ```go type Provider interface { Open(map[string]interface{}) (Provider, error) Put(Entry) error Get([]byte) ([]byte, error) Has([]byte) (bool, error) Delete([]byte) error Batch([]Entry) error Scan(ScanOpts) Close() error } ``` 和 database/sql 具体驱动类似,具体 Provider 引入也是采用了 `_` 的形式。 这种设计方法学会了吗?

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2922 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传