写点什么

今日谈:BoltDB 数据库,一款纯 Go 实现的 KV 数据库

作者:Regan Yue
  • 2021 年 11 月 18 日
  • 本文字数:1233 字

    阅读完需:约 4 分钟

今日谈:BoltDB 数据库,一款纯 Go 实现的 KV 数据库

一、什么是 BoltDB

这是一款纯粹使用 Go 语言编写的 key/value 数据库,据说它是参考了开源的内存映射数据库 LMDB。值得注意的是,这款数据库不支持网络连接,也没有复杂的 SQL 语句查询支持。但是它在 Go 的应用中能够比较方便的来达到数据持久化。

二、使用场景

  1. Go 语言编写的程序,这个程序需要内嵌数据库。

  2. 不需要复杂的 SQL 语句查询。

  3. 这款数据库更擅长读的操作,所以在读多写少的场景下,它效果比较好。

三、安装及使用方法

安装方法很简单,就是在命令行执行:


go get github.com/boltdb/bolt/...
复制代码


那么我们如何打开数据库呢?我们来看一看下面这段代码。


package main
import ( "log" "github.com/boltdb/bolt")
func main() { // Open the my.db data file in your current directory. // It will be created if it doesn't exist. db, err := bolt.Open("my.db", 0600, nil) if err != nil { log.Fatal(err) } defer db.Close() ...}
复制代码


这个 bolt.Open()是在给定的路径上打开数据库。如果要打开的数据库文件不存在,则将自动创建该文件。第二个参数是文件模式。第三个参数传入 nil 值就让 Bolt 使用默认选项打开数据库。


Bolt 多个进程无法同时打开同一个数据库。打开一个已经打开的 Bolt 数据库会导致它挂起,直到另一个进程关闭它。为了防止无限期等待,我们需要给Open()函数一个超时参数:


db, err := bolt.Open("my.db", 0600, &bolt.Options{Timeout: 1 * time.Second})
复制代码

事务

Bolt 一次只支持一个读写事务,但是一次可以支持多个只读事务。


用于读写的事务 API 是 Update,二用于读的事务 API 是 View。


err := db.Update(func(tx *bolt.Tx) error {  ...  return nil})
复制代码


err := db.View(func(tx *bolt.Tx) error {  ...  return nil})
复制代码


注意:只读事务和读写事务通常不应同时在同一个 goroutine 中打开。这可能会导致死锁,因为读写事务需要定期重新映射数据文件,但在只读事务打开时无法这样做。


还有一种 Batch 事务可以减小并发写操作的开销。Batch 仅在有多个 goroutine 调用它时才有用。


err := db.Batch(func(tx *bolt.Tx) error {  ...  return nil})
复制代码

读写操作

db.Update(func(tx *bolt.Tx) error {  b := tx.Bucket([]byte("MyBucket"))  err := b.Put([]byte("answer"), []byte("42"))  return err})
复制代码


这是往数据库中写入键为 answer 值为 42 的数据。


db.View(func(tx *bolt.Tx) error {  b := tx.Bucket([]byte("MyBucket"))  v := b.Get([]byte("answer"))  fmt.Printf("The answer is: %s\n", v)  return nil})
复制代码


这是读取键为 answer 的数据。


是不是发现有个 tx.Bucket()不知道是干什么的呢?


Bolt 有个很有意思的地方就是这个 Bucket,这个是这个数据库组织数据的基本方式,比如有一个 Bucket 叫公司,这个 Bucket 里面还建一个 Bucket 叫部门,里面建一个 key:ReganYue,这就说明 ReganYue 是这个部门里面的人,但是同时也是这个公司里面的人,这个 key 属于部门这个 Bucket,也属于公司这个 Bucket。

发布于: 19 小时前阅读数: 6
用户头像

Regan Yue

关注

还未添加个人签名 2020.08.12 加入

对Go、Python、网络安全、区块链感兴趣. · 华为云云享专家 · 掘金资讯创作者

评论

发布
暂无评论
今日谈:BoltDB数据库,一款纯Go实现的KV数据库