這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
說明
BoltDB是一個嵌入式key/value的資料庫,即只需要將其連結到你的應用程式代碼中即可使用BoltDB提供的API來高效的存取資料。而且BoltDB支援完全可序列化的ACID事務,讓應用程式可以更簡單的處理複雜操作。
BoltDB設計源於LMDB,具有以下特點:
- 直接使用API存取資料,沒有查詢語句;
- 支援完全可序列化的ACID事務,這個特性比LevelDB強;
- 資料儲存在記憶體映射的檔案裡。沒有wal、線程壓縮和記憶體回收;
- 通過COW技術,可實現無鎖的讀寫並發,但是無法實現無鎖的寫寫並發,這就註定了讀效能超高,但寫效能一般,適合與讀多寫少的情境。
最後,BoltDB使用Golang開發,而且被應用於influxDB項目作為底層儲存。
使用
安裝BoltDB
go get github.com/boltdb/bolt/...
開啟資料庫
package mainimport ( "log" "github.com/boltdb/bolt")func main() { db, err := bolt.Open("my.db", 0600, nil) if err != nil { log.Fatal(err) } defer db.Close() ...}
更新事務
err := db.Update(func(tx *bolt.Tx) error { ... return nil})
說明:
- 通過該介面可以實現資料更新操作
- 該操作會被當做一個事務來處理,如果Update()內的操作返回nil,則事務會被提交,否則事務會復原
唯讀事務
err := db.View(func(tx *bolt.Tx) error { ... return nil})
說明:
批次更新事務
err := db.Batch(func(tx *bolt.Tx) error { ... return nil})
說明:
- 通過該介面可以實現多次資料更新操作
- 所有的更新會被當做一個事務來處理,如果Update()內的操作返回nil,則事務會被提交,否則事務會復原
手動交易管理
// Start a writable transaction.tx, err := db.Begin(true)if err != nil { return err}defer tx.Rollback()// Use the transaction..._, err := tx.CreateBucket([]byte("MyBucket"))if err != nil { return err}// Commit the transaction and check for error.if err := tx.Commit(); err != nil { return err}
說明:
- 自己建立事務,並管理事務的提交和復原,沒有利用BoltDB提供的封裝式寫法
更多
更多更好玩的用法請參考 boltdb/bolt
效能測試
為了讓大家對BoltDB有一個直觀的瞭解,我對它做了一些基本的效能測試,結果如下:
環境準備
單線程建立1000個bucket,並且每個bucket插入10w條資料,因此,總資料量約為1億。
並發寫測試
測試原理:
- 測試過程中調整寫入並發數
- 保持並發數不變,調整寫入次數
並發讀測試
每輪測試預先建立1000個bucket,每個Bucket建立100條記錄,共10w條記錄,讀取過程中隨機播放bucket。