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

举报
Regan Yue 发表于 2021/11/18 21:12:56 2021/11/18
【摘要】 本文首发于华为云今日谈:BoltDB数据库,一款纯Go实现的KV数据库一、什么是BoltDB这是一款纯粹使用Go语言编写的key/value数据库,据说它是参考了开源的内存映射数据库LMDB。值得注意的是,这款数据库不支持网络连接,也没有复杂的SQL语句查询支持。但是它在Go的应用中能够比较方便的来达到数据持久化。二、使用场景Go语言编写的程序,这个程序需要内嵌数据库。不需要复杂的SQL语句...

本文首发于华为云

今日谈: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。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。