最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2023年02月03日 09:28:30   作者:raoxiaoya  
這篇文章主要介紹了GoLang BoltDB數(shù)據(jù)庫(kù),boltdb是使用Go語(yǔ)言編寫的開(kāi)源的鍵值對(duì)數(shù)據(jù)庫(kù),boltdb存儲(chǔ)數(shù)據(jù)時(shí) key和value都要求是字節(jié)數(shù)據(jù),此處需要使用到 序列化和反序列化

說(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ù),讓應(yīng)用程序可以更簡(jiǎn)單的處理復(fù)雜操作。

BoltDB設(shè)計(jì)源于LMDB,具有以下特點(diǎn):

  • 使用Go語(yǔ)言編寫
  • 不需要服務(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ú)鎖的讀寫并發(fā),但是無(wú)法實(shí)現(xiàn)無(wú)鎖的寫寫并發(fā),這就注定了讀性能超高,但寫性能一般,適合與讀多寫少的場(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提供的封裝式寫法 示例

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設(shè)計(jì)模式之模板方法模式講解和代碼示例

    Go設(shè)計(jì)模式之模板方法模式講解和代碼示例

    模版方法是一種行為設(shè)計(jì)模式, 它在基類中定義了一個(gè)算法的框架, 允許子類在不修改結(jié)構(gòu)的情況下重寫算法的特定步驟,本文將通過(guò)代碼示例給大家詳細(xì)的介紹一下Go模板方法模式,需要的朋友可以參考下
    2023-08-08
  • Go?Error?嵌套實(shí)現(xiàn)創(chuàng)建方式

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

    一文帶你了解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碎片整理之 fmt.Scan

    詳解golang碎片整理之 fmt.Scan

    本文介紹了從golang語(yǔ)言中fmt包從標(biāo)準(zhǔn)輸入獲取數(shù)據(jù)的Scan系列函數(shù)、從io.Reader中獲取數(shù)據(jù)的Fscan系列函數(shù)以及從字符串中獲取數(shù)據(jù)的Sscan系列函數(shù)的用法,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Golang學(xué)習(xí)筆記之延遲函數(shù)(defer)的使用小結(jié)

    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ì)模式示例詳解

    這篇文章主要為大家介紹了Go語(yǔ)言基礎(chǔ)設(shè)計(jì)模式之模板模式的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • go modules中replace使用方法

    go modules中replace使用方法

    這篇文章主要為大家介紹了go modules中replace使用方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Golang中runtime的使用詳解

    Golang中runtime的使用詳解

    這篇文章主要介紹了Golang中runtime的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 深度剖析Golang如何實(shí)現(xiàn)GC掃描對(duì)象

    深度剖析Golang如何實(shí)現(xiàn)GC掃描對(duì)象

    這篇文章主要為大家詳細(xì)介紹了Golang是如何實(shí)現(xiàn)GC掃描對(duì)象的,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的小伙伴可以參考一下
    2023-03-03
  • Golang二維數(shù)組的使用方式

    Golang二維數(shù)組的使用方式

    之前給大家講過(guò)很多二維數(shù)組的知識(shí),今天重點(diǎn)給大家介紹Golang二維數(shù)組的使用方式,通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-05-05

最新評(píng)論

广昌县| 鄂托克前旗| 双江| 卢湾区| 大宁县| 莱西市| 朝阳县| 长泰县| 浪卡子县| 泸溪县| 凤山市| 舟山市| 垫江县| 湟中县| 精河县| 巴林右旗| 万载县| 泌阳县| 楚雄市| 平昌县| 峨眉山市| 铜鼓县| 佳木斯市| 牡丹江市| 明水县| 东港市| 秦皇岛市| 安平县| 威信县| 班戈县| 广水市| 万载县| 兴安盟| 贡觉县| 松潘县| 长兴县| 天水市| 攀枝花市| 麻阳| 越西县| 鄂伦春自治旗|