欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

GoLang BoltDB數(shù)據(jù)庫詳解

 更新時(shí)間:2023年02月03日 09:28:30   作者:raoxiaoya  
這篇文章主要介紹了GoLang BoltDB數(shù)據(jù)庫,boltdb是使用Go語言編寫的開源的鍵值對數(shù)據(jù)庫,boltdb存儲數(shù)據(jù)時(shí) key和value都要求是字節(jié)數(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)文章

  • 圖文詳解Go中的channel

    圖文詳解Go中的channel

    Channel是go語言內(nèi)置的一個(gè)非常重要的特性,也是go并發(fā)編程的兩大基石之一,下面這篇文章主要給大家介紹了關(guān)于Go中channel的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Golang 標(biāo)準(zhǔn)庫 tips之waitgroup詳解

    Golang 標(biāo)準(zhǔn)庫 tips之waitgroup詳解

    本篇文章給大家介紹Golang 標(biāo)準(zhǔn)庫 tips之waitgroup的相關(guān)知識,包括使用 channel 實(shí)現(xiàn) WaitGroup 的功能介紹,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • golang解析xml的方法

    golang解析xml的方法

    這篇文章主要介紹了golang解析xml的方法,結(jié)合實(shí)例形式分析了Go語言針對xml文件的讀取與解析的相關(guān)技巧,需要的朋友可以參考下
    2016-07-07
  • 基于go語言實(shí)現(xiàn)圖片驗(yàn)證碼的代碼示例

    基于go語言實(shí)現(xiàn)圖片驗(yàn)證碼的代碼示例

    這篇文章主要為大家詳細(xì)介紹了基于go語言實(shí)現(xiàn)圖片驗(yàn)證碼的代碼示例,文中的示例代碼簡潔易懂,具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • 一文搞懂Go語言中文件的讀寫與創(chuàng)建

    一文搞懂Go語言中文件的讀寫與創(chuàng)建

    這篇文章主要為大家詳細(xì)介紹了Go語言中文件是如何實(shí)現(xiàn)讀寫與創(chuàng)建的,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Go語言有一定幫助,需要的可以參考一下
    2022-07-07
  • golang?開啟opencv圖形化編程

    golang?開啟opencv圖形化編程

    這篇文章主要為大家介紹了golang?開啟opencv圖形化編程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Go語言fsnotify接口實(shí)現(xiàn)監(jiān)測文件修改

    Go語言fsnotify接口實(shí)現(xiàn)監(jiān)測文件修改

    這篇文章主要為大家介紹了Go語言fsnotify接口實(shí)現(xiàn)監(jiān)測文件修改的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • go語言實(shí)現(xiàn)http服務(wù)端與客戶端的例子

    go語言實(shí)現(xiàn)http服務(wù)端與客戶端的例子

    今天小編就為大家分享一篇go語言實(shí)現(xiàn)http服務(wù)端與客戶端的例子,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Go 微服務(wù)開發(fā)框架DMicro設(shè)計(jì)思路詳解

    Go 微服務(wù)開發(fā)框架DMicro設(shè)計(jì)思路詳解

    這篇文章主要為大家介紹了Go 微服務(wù)開發(fā)框架DMicro設(shè)計(jì)思路詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Go中使用單調(diào)時(shí)鐘獲得準(zhǔn)確的時(shí)間間隔問題

    Go中使用單調(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

最新評論