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

37次阅读

共计 1607 个字符,预计需要花费 5 分钟才能阅读完成。

作者:ReganYue

起源:恒生 LIGHT 云社区

一、什么是 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。

正文完
 0