GoLang BoltDB數(shù)據(jù)庫詳解
說明
Bolt是一個(gè)純粹Key/Value
模型的程序。該項(xiàng)目的目標(biāo)是為不需要完整數(shù)據(jù)庫服務(wù)器(如Postgres或MySQL)的項(xiàng)目提供一個(gè)簡單,快速,可靠的數(shù)據(jù)庫。
BoltDB只需要將其鏈接到你的應(yīng)用程序代碼中即可使用BoltDB提供的API來高效的存取數(shù)據(jù)。而且BoltDB支持完全可序列化的ACID事務(wù),讓應(yīng)用程序可以更簡單的處理復(fù)雜操作。
BoltDB設(shè)計(jì)源于LMDB,具有以下特點(diǎn):
- 使用Go語言編寫
- 不需要服務(wù)器即可運(yùn)行
- 支持?jǐn)?shù)據(jù)結(jié)構(gòu)
- 直接使用API存取數(shù)據(jù),沒有查詢語句
- 支持完全可序列化的ACID事務(wù),這個(gè)特性比LevelDB強(qiáng)
- 數(shù)據(jù)保存在內(nèi)存映射的文件里。沒有wal、線程壓縮和垃圾回收
- 通過COW技術(shù),可實(shí)現(xiàn)無鎖的讀寫并發(fā),但是無法實(shí)現(xiàn)無鎖的寫寫并發(fā),這就注定了讀性能超高,但寫性能一般,適合與讀多寫少的場景
BoltDB是一個(gè)Key/Value
(鍵/值)存儲,這意味著沒有像SQL RDBMS(MySQL,PostgreSQL等)
中的表,沒有行,沒有列。相反,數(shù)據(jù)作為鍵值對存儲(如在Golang Maps中)。鍵值對存儲在Buckets中,它們旨在對相似的對進(jìn)行分組(這與RDBMS中的表類似)。因此,為了獲得Value(值),需要知道該Value所在的桶和鑰匙。
go get -u github.com/boltdb/bolt
打開數(shù)據(jù)庫
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 })
說明:
- 通過該接口可以實(shí)現(xiàn)數(shù)據(jù)更新操作該操作
- 會(huì)被當(dāng)做一個(gè)事務(wù)來處理,如果Update()內(nèi)的操作返回nil,則事務(wù)會(huì)被提交,否則事務(wù)會(huì)回滾
只讀操作
err := db.View(func(tx *bolt.Tx) error { ... return nil })
說明:
通過該接口可以且只能進(jìn)行數(shù)據(jù)查詢操作 批量更新事務(wù)
err := db.Batch(func(tx *bolt.Tx) error { ... return nil })
說明:
- 通過該接口可以實(shí)現(xiàn)多次數(shù)據(jù)更新操作
- 所有的更新會(huì)被當(dāng)做一個(gè)事務(wù)來處理,如果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 }
說明:
自己創(chuàng)建事務(wù),并管理事務(wù)的提交和回滾,沒有利用BoltDB提供的封裝式寫法 示例
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ù)庫詳解的文章就介紹到這了,更多相關(guān)Go BoltDB內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang 標(biāo)準(zhǔn)庫 tips之waitgroup詳解
本篇文章給大家介紹Golang 標(biāo)準(zhǔn)庫 tips之waitgroup的相關(guān)知識,包括使用 channel 實(shí)現(xiàn) WaitGroup 的功能介紹,感興趣的朋友跟隨小編一起看看吧2021-07-07基于go語言實(shí)現(xiàn)圖片驗(yàn)證碼的代碼示例
這篇文章主要為大家詳細(xì)介紹了基于go語言實(shí)現(xiàn)圖片驗(yàn)證碼的代碼示例,文中的示例代碼簡潔易懂,具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10Go語言fsnotify接口實(shí)現(xiàn)監(jiān)測文件修改
這篇文章主要為大家介紹了Go語言fsnotify接口實(shí)現(xiàn)監(jiān)測文件修改的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06go語言實(shí)現(xiàn)http服務(wù)端與客戶端的例子
今天小編就為大家分享一篇go語言實(shí)現(xiàn)http服務(wù)端與客戶端的例子,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08Go 微服務(wù)開發(fā)框架DMicro設(shè)計(jì)思路詳解
這篇文章主要為大家介紹了Go 微服務(wù)開發(fā)框架DMicro設(shè)計(jì)思路詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10Go中使用單調(diào)時(shí)鐘獲得準(zhǔn)確的時(shí)間間隔問題
這篇文章主要介紹了Go中使用單調(diào)時(shí)鐘獲得準(zhǔn)確的時(shí)間間隔,在go語言中,沒有直接調(diào)用時(shí)鐘的函數(shù),可以通過?time.Now()?獲得帶單調(diào)時(shí)鐘的?Time?結(jié)構(gòu)體,并通過Since和Until獲得相對準(zhǔn)確的時(shí)間間隔,需要的朋友可以參考下2022-06-06