作者:ReganYue
來源:恒生LIGHT云社區
一、什么是BoltDB
這是一款純粹使用Go語言編寫的key/value數據庫,據說它是參考了開源的內存映射數據庫LMDB。值得注意的是,這款數據庫不支持網絡連接,也沒有復雜的SQL語句查詢支持。但是它在Go的應用中能夠比較方便的來達到數據持久化。
二、使用場景
- Go語言編寫的程序,這個程序需要內嵌數據庫。
- 不需要復雜的SQL語句查詢。
- 這款數據庫更擅長讀的操作,所以在讀多寫少的場景下,它效果比較好。
三、安裝及使用方法
安裝方法很簡單,就是在命令行執行:
</>復制代碼
go get github.com/boltdb/bolt/...
那么我們如何打開數據庫呢?我們來看一看下面這段代碼。
</>復制代碼
package mainimport ( "log" "github.com/boltdb/bolt")func main() { // Open the my.db data file in your current directory. // It will be created if it doesnt 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。