Bolt是一個純粹Key/Value模型的程序。該項目的目標是爲不須要完整數據庫服務器(如Postgres或MySQL)的項目提供一個簡單,快速,可靠的數據庫。html
BoltDB只須要將其連接到你的應用程序代碼中便可使用BoltDB提供的API來高效的存取數據。並且BoltDB支持徹底可序列化的ACID事務,讓應用程序能夠更簡單的處理複雜操做。git
其源碼地址爲:https://github.com/boltdb/boltgithub
BoltDB設計源於LMDB,具備如下特色:數據庫
使用Go語言編寫windows
不須要服務器便可運行數組
支持數據結構服務器
直接使用API存取數據,沒有查詢語句;數據結構
支持徹底可序列化的ACID事務,這個特性比LevelDB強;併發
數據保存在內存映射的文件裏。沒有wal、線程壓縮和垃圾回收;工具
經過COW技術,可實現無鎖的讀寫併發,可是沒法實現無鎖的寫寫併發,這就註定了讀性能超高,但寫性能通常,適合與讀多寫少的場景。
BoltDB是一個Key/Value(鍵/值)存儲,這意味着沒有像SQL RDBMS(MySQL,PostgreSQL等)中的表,沒有行,沒有列。相反,數據做爲鍵值對存儲(如在Golang Maps中)。鍵值對存儲在Buckets中,它們旨在對類似的對進行分組(這與RDBMS中的表相似)。所以,爲了得到Value(值),須要知道該Value所在的桶和鑰匙。
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% 中定義的路徑去查找第三方類庫 )
//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下
//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) }
//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.查看錶數據 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) }