GoLang BoltDB數(shù)據(jù)庫(kù)詳解
說(shuō)明
Bolt是一個(gè)純粹Key/Value模型的程序。該項(xiàng)目的目標(biāo)是為不需要完整數(shù)據(jù)庫(kù)服務(wù)器(如Postgres或MySQL)的項(xiàng)目提供一個(gè)簡(jiǎn)單,快速,可靠的數(shù)據(jù)庫(kù)。
BoltDB只需要將其鏈接到你的應(yīng)用程序代碼中即可使用BoltDB提供的API來(lái)高效的存取數(shù)據(jù)。而且BoltDB支持完全可序列化的ACID事務(wù),讓?xiě)?yīng)用程序可以更簡(jiǎn)單的處理復(fù)雜操作。
BoltDB設(shè)計(jì)源于LMDB,具有以下特點(diǎn):
- 使用Go語(yǔ)言編寫(xiě)
- 不需要服務(wù)器即可運(yùn)行
- 支持?jǐn)?shù)據(jù)結(jié)構(gòu)
- 直接使用API存取數(shù)據(jù),沒(méi)有查詢語(yǔ)句
- 支持完全可序列化的ACID事務(wù),這個(gè)特性比LevelDB強(qiáng)
- 數(shù)據(jù)保存在內(nèi)存映射的文件里。沒(méi)有wal、線程壓縮和垃圾回收
- 通過(guò)COW技術(shù),可實(shí)現(xiàn)無(wú)鎖的讀寫(xiě)并發(fā),但是無(wú)法實(shí)現(xiàn)無(wú)鎖的寫(xiě)寫(xiě)并發(fā),這就注定了讀性能超高,但寫(xiě)性能一般,適合與讀多寫(xiě)少的場(chǎng)景
BoltDB是一個(gè)Key/Value(鍵/值)存儲(chǔ),這意味著沒(méi)有像SQL RDBMS(MySQL,PostgreSQL等)中的表,沒(méi)有行,沒(méi)有列。相反,數(shù)據(jù)作為鍵值對(duì)存儲(chǔ)(如在Golang Maps中)。鍵值對(duì)存儲(chǔ)在Buckets中,它們旨在對(duì)相似的對(duì)進(jìn)行分組(這與RDBMS中的表類似)。因此,為了獲得Value(值),需要知道該Value所在的桶和鑰匙。
go get -u github.com/boltdb/bolt
打開(kāi)數(shù)據(jù)庫(kù)
db, err := bolt.Open(dbfile, 0600, nil)
if err != nil {
log.Fatal(err)
}
defer db.Close()
更新事務(wù)
err := db.Update(func(tx *bolt.Tx) error {
...
return nil
})
說(shuō)明:
- 通過(guò)該接口可以實(shí)現(xiàn)數(shù)據(jù)更新操作該操作
- 會(huì)被當(dāng)做一個(gè)事務(wù)來(lái)處理,如果Update()內(nèi)的操作返回nil,則事務(wù)會(huì)被提交,否則事務(wù)會(huì)回滾
只讀操作
err := db.View(func(tx *bolt.Tx) error {
...
return nil
})
說(shuō)明:
通過(guò)該接口可以且只能進(jìn)行數(shù)據(jù)查詢操作 批量更新事務(wù)
err := db.Batch(func(tx *bolt.Tx) error {
...
return nil
})
說(shuō)明:
- 通過(guò)該接口可以實(shí)現(xiàn)多次數(shù)據(jù)更新操作
- 所有的更新會(huì)被當(dāng)做一個(gè)事務(wù)來(lái)處理,如果Update()內(nèi)的操作返回nil,則事務(wù)會(huì)被提交,否則事務(wù)會(huì)回滾
手動(dòng)事務(wù)管理
// 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
}
說(shuō)明:
自己創(chuàng)建事務(wù),并管理事務(wù)的提交和回滾,沒(méi)有利用BoltDB提供的封裝式寫(xiě)法 示例
package main
import (
"fmt"
"log"
"github.com/boltdb/bolt"
)
var dbfile = "boltdbfile.db"
var bdb *bolt.DB
var bucket = []byte("MyBuckets")
func main() {
var err error
bdb, err = bolt.Open(dbfile, 0600, nil)
if err != nil {
log.Fatal(err)
}
defer func() {
_ = bdb.Close()
}()
CreateBuckets()
updateData()
selectData()
}
func CreateBuckets() error {
return bdb.Update(func(tx *bolt.Tx) error {
_, err := tx.CreateBucketIfNotExists(bucket)
return err
})
}
func updateData() error {
return bdb.Update(func(tx *bolt.Tx) error {
bk := tx.Bucket(bucket)
if bk != nil {
e1 := bk.Put([]byte("name"), []byte("rao"))
if e1 != nil {
return e1
}
e2 := bk.Put([]byte("age"), []byte("12"))
if e2 != nil {
return e2
}
}
return nil
})
}
func selectData() error {
var name, age []byte
return bdb.View(func(tx *bolt.Tx) error {
bk := tx.Bucket(bucket)
if bk != nil {
name = bk.Get([]byte("name"))
age = bk.Get([]byte("age"))
}
fmt.Printf("%s\n", name)
fmt.Printf("%s\n", age)
return nil
})
}
到此這篇關(guān)于GoLang BoltDB數(shù)據(jù)庫(kù)詳解的文章就介紹到這了,更多相關(guān)Go BoltDB內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go?Error?嵌套實(shí)現(xiàn)創(chuàng)建方式
這篇文章主要介紹了Go?Error?嵌套到底是怎么實(shí)現(xiàn)的?大家都知道創(chuàng)建error有兩種方式分別是errors.new()另一種是fmt.errorf(),本文通過(guò)詳細(xì)例子給大家介紹,需要的朋友可以參考下2022-01-01
一文帶你了解Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)math和rand的常用函數(shù)
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)math和rand中的常用函數(shù),文中的示例代碼講解詳細(xì), 對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,感興趣的小伙伴可以了解一下2022-12-12
Golang學(xué)習(xí)筆記之延遲函數(shù)(defer)的使用小結(jié)
這篇文章主要介紹了Golang學(xué)習(xí)筆記之延遲函數(shù)(defer),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
Go語(yǔ)言基礎(chǔ)模板設(shè)計(jì)模式示例詳解
這篇文章主要為大家介紹了Go語(yǔ)言基礎(chǔ)設(shè)計(jì)模式之模板模式的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11
深度剖析Golang如何實(shí)現(xiàn)GC掃描對(duì)象
這篇文章主要為大家詳細(xì)介紹了Golang是如何實(shí)現(xiàn)GC掃描對(duì)象的,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的小伙伴可以參考一下2023-03-03

