天天看點

BoltDB簡單使用教程

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中的源代碼的,該方法更便捷!】

BoltDB簡單使用教程

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