1.BoltDB簡介
Bolt是一個純粹Key/Value模型的程式。該項目的目标是為不需要完整資料庫伺服器(如Postgres或MySQL)的項目提供一個簡單,快速,可靠的資料庫。
BoltDB隻需要将其連結到你的應用程式代碼中即可使用BoltDB提供的API來高效的存取資料。而且BoltDB支援完全可序列化的ACID事務,讓應用程式可以更簡單的處理複雜操作。
其源碼位址為:https://github.com/boltdb/bolt
2.BoltDB特性
BoltDB設計源于LMDB,具有以下特點:
- 使用Go語言編寫
- 不需要伺服器即可運作
- 支援資料結構
- 直接使用API存取資料,沒有查詢語句;
- 支援完全可序列化的ACID事務,這個特性比LevelDB強;
- 資料儲存在記憶體映射的檔案裡。沒有wal、線程壓縮和垃圾回收;
- 通過COW技術,可實作無鎖的讀寫并發,但是無法實作無鎖的寫寫并發,這就注定了讀性能超高,但寫性能一般,适合與讀多寫少的場景。
BoltDB是一個Key/Value(鍵/值)存儲,這意味着沒有像SQL RDBMS(MySQL,PostgreSQL等)中的表,沒有行,沒有列。相反,資料作為鍵值對存儲(如在Golang Maps中)。鍵值對存儲在Buckets中,它們旨在對相似的對進行分組(這與RDBMS中的表類似)。是以,為了獲得Value(值),需要知道該Value所在的桶和鑰匙。
3.BoltDB的安裝
Linux中:
$ go get github.com/boltdb/bolt/...
Windows中:
1.前提是已經安裝GO語言環境.
2.安裝git for windows :
http://git-for-windows.github.io/
3.安裝Git後才能執行指令:
go get github.com/boltdb/bolt/...
來安裝第三方包。這條指令它會把 類庫包源代碼,下載下傳解壓到你的 %GOPATH% 路徑裡面去,比如:C:\go\gopath\ src\github.com\...
前面是gopath路徑,後面是類庫,并且它還會同時執行 go install xxx ,生成 D:\go\gopath\pkg\xxxx 這樣的包路徑。
注意:
【在GoLand開發工具中,是可以直接擷取GitHub中的源代碼的,該方法更便捷!】

4. 在代碼中導入第三方包:
import (
"github.com/boltdb/bolt" // 從環境變量:%goPath% 中定義的路徑去查找第三方類庫
)
4.BoltDB簡單使用
4.1 打開或建立資料庫
//1.資料庫建立
//在這裡gland直接運作,生成的my.db在main.go上層目錄;指令行build在運作的話是目前目錄!!!
db, err := bolt.Open("chaorsBlock.db", 0600, nil)
if err != nil {
log.Fatal(err)
}
defer db.Close()
如果通過goland程式運作建立的my.db會儲存在$GOPATH /src/Project目錄下
如果通過go build main.go ; ./main 執行生成的my.db,會儲存在目前目錄$GOPATH /src/Project/package下
4.2 資料庫操作
4.2.1 建立資料庫表
//2.建立表
err = db.Update(func(tx *bolt.Tx) error {
//判斷要建立的表是否存在
b := tx.Bucket([]byte("MyBlocks"))
if b == nil {
//建立叫"MyBucket"的表
_, err := tx.CreateBucket([]byte("MyBlocks"))
if err != nil {
//也可以在這裡對表做插入操作
log.Fatal(err)
}
}
//一定要傳回nil
return nil
})
//更新資料庫失敗
if err != nil {
log.Fatal(err)
}
4.2.2 更新
//3.更新表資料
err = db.Update(func(tx *bolt.Tx) error {
//取出叫"MyBucket"的表
b := tx.Bucket([]byte("MyBlocks"))
//往表裡面存儲資料
if b != nil {
//插入的鍵值對資料類型必須是位元組數組
err := b.Put([]byte("l"), []byte("0x0000"))
err := b.Put([]byte("ll"), []byte("0x0001"))
err := b.Put([]byte("lll"), []byte("0x0002"))
if err != nil {
log.Fatal(err)
}
}
//一定要傳回nil
return nil
})
//更新資料庫失敗
if err != nil {
log.Fatal(err)
}
4.2.3 查詢
//4.檢視表資料
err = db.View(func(tx *bolt.Tx) error {
//取出叫"MyBucket"的表
b := tx.Bucket([]byte("MyBlocks"))
//往表裡面存儲資料
if b != nil {
data := b.Get([]byte("l"))
fmt.Printf("%s\n", data)
data := b.Get([]byte("l"))
fmt.Printf("%s\n", data)
}
//一定要傳回nil
return nil
})
//查詢資料庫失敗
if err != nil {
log.Fatal(err)
}