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) }
