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

Golang高性能持久化解決方案BoltDB數(shù)據(jù)庫(kù)介紹

 更新時(shí)間:2021年11月16日 14:23:06   作者:夢(mèng)想畫(huà)家  
這篇文章主要為大家介紹了Golang高性能持久化解決方案BoltDB數(shù)據(jù)庫(kù)介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步

1. 介紹Bolt

BoltDB是純Go語(yǔ)言實(shí)現(xiàn)的持久化解決方案,保存數(shù)據(jù)至內(nèi)存映射文件。稱(chēng)之為持久化解決方案不是數(shù)據(jù)庫(kù),因?yàn)閿?shù)據(jù)庫(kù)這個(gè)詞有很多額外功能是bolt所不具備的。正是因?yàn)槿狈@些功能使得bolt如此優(yōu)雅、好用。

Bolt就是一個(gè)Go包。無(wú)需在系統(tǒng)中安裝,開(kāi)始編碼前也無(wú)需配置,什么都不需要,僅需要go get github.com/boltdb/bolt,然后import “github.com/boltdb/bolt”

要完全使用bolt的存儲(chǔ)功能,只需要一個(gè)文件名。無(wú)論從開(kāi)發(fā)者或用戶(hù)視角都感覺(jué)不可思議。不知你的感想如何,在我的工作經(jīng)歷中花過(guò)很多時(shí)間搭建數(shù)據(jù)庫(kù)環(huán)境,調(diào)試配置問(wèn)題,用戶(hù)和權(quán)限以及其他各種問(wèn)題,如關(guān)系型數(shù)據(jù)庫(kù)PostgreSql、Oracle和NoSQL。這些bolt都不需要,沒(méi)有用戶(hù)、無(wú)需安裝,僅一個(gè)文件名。這對(duì)應(yīng)用程序的用戶(hù)來(lái)說(shuō)也是一種恩惠,因?yàn)樗麄円膊槐貫槟切┞闊﹩?wèn)題而瞎折騰。

Bolt不是關(guān)系型數(shù)據(jù)庫(kù)。甚至不存儲(chǔ)文檔,雖然你可以按照這種方式使用它。其僅僅存儲(chǔ)鍵值對(duì)…但是如果你不知道這是什么意思或者不知道你如何使用它進(jìn)行存儲(chǔ),也不用擔(dān)心。它超級(jí)簡(jiǎn)單,而且非常靈活,讓我們來(lái)看看。

2. 示例

bolt存儲(chǔ)是分組為桶,桶是一組鍵值對(duì)集合的名稱(chēng),就像Go中的map。桶的名稱(chēng)、鍵以及值都是[]byte類(lèi)型。桶可以包括其他桶,也可以通過(guò)[]byte類(lèi)型名稱(chēng)作為key。

…就是這樣。不,真的,就這樣。Bolt基本上是一組嵌套映射。這種簡(jiǎn)單性使得它易于使用。不需要設(shè)置表、模式、復(fù)雜的查詢(xún)語(yǔ)言。讓我們看看一個(gè)bolt入門(mén)示例:

package main
import (
	"fmt"
	"github.com/boltdb/bolt"
	"log"
)
var world = []byte("greeting")
func main() {
	db, err := bolt.Open("d:/bolt.db", 0644, nil)
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()
	key := []byte("hello")
	value := []byte("Hello World!")
	// store some data
	err = db.Update(func(tx *bolt.Tx) error {
		bucket, err := tx.CreateBucketIfNotExists(world)
		if err != nil {
			return err
		}

		err = bucket.Put(key, value)
		if err != nil {
			return err
		}
		return nil
	})
	if err != nil {
		log.Fatal(err)
	}
	// retrieve the data
	err = db.View(func(tx *bolt.Tx) error {
		bucket := tx.Bucket(world)
		if bucket == nil {
			return fmt.Errorf("Bucket %s not found!", world)
		}
		val := bucket.Get(key)
		fmt.Println(string(val))
		return nil
	})
	if err != nil {
		log.Fatal(err)
	}
}

輸出:Hello World!

我想你正在思索————這代碼似乎有點(diǎn)長(zhǎng)。但請(qǐng)記住,我完全處理了所有錯(cuò)誤,至少是半正確的方式,我們正在做的所有這些:

創(chuàng)建數(shù)據(jù)庫(kù)

創(chuàng)建結(jié)構(gòu)(greeting分組)

存儲(chǔ)數(shù)據(jù)到結(jié)構(gòu)中

從結(jié)構(gòu)中獲取數(shù)據(jù)

不算太壞,加上空行也不過(guò)54行代碼。下面詳細(xì)解釋下上面示例具體實(shí)現(xiàn)內(nèi)容。

3. 示例分析

首先bolt.Open連接數(shù)據(jù)庫(kù),如果需要?jiǎng)?chuàng)建文件或打開(kāi)已存在的文件。
所有bolt讀寫(xiě)操作都必須在事務(wù)內(nèi)進(jìn)行。在只讀事務(wù)中同時(shí)可以有很多讀操作,但寫(xiě)操作一次只能有一個(gè)(當(dāng)寫(xiě)入器寫(xiě)入時(shí),讀取器維護(hù)數(shù)據(jù)庫(kù)的一致視圖)。

剛開(kāi)始調(diào)用db.Update,帶有一個(gè)函數(shù)作為參數(shù),函數(shù)自身的參數(shù)為bolt.Tx ————bolt的事務(wù)對(duì)象。然后創(chuàng)建桶(bolt所有數(shù)據(jù)都用桶組織),接著增加鍵值對(duì)。寫(xiě)事務(wù)完成后開(kāi)始讀操作————使用DB.View事務(wù)獲取剛寫(xiě)入的數(shù)據(jù)。

bolt事務(wù)機(jī)制的強(qiáng)大之處在于它超級(jí)簡(jiǎn)單——函數(shù)作用域就是事務(wù)的范圍。如果函數(shù)傳入U(xiǎn)pdate并返回nil,事務(wù)中所有更新操作是原子的存入庫(kù)中。如果函數(shù)返回錯(cuò)誤則事務(wù)回滾。這使得bolt事務(wù)對(duì)Go開(kāi)發(fā)者來(lái)說(shuō)非常簡(jiǎn)單。只要像平時(shí)一樣返回一個(gè)錯(cuò)誤,就可以提前退出函數(shù),bolt也做了正確的事情。無(wú)需擔(dān)心手動(dòng)回滾更新或其他事情,只需返回一個(gè)錯(cuò)誤。

你可能需要另一個(gè)基本操作是遍歷桶中的鍵/值對(duì),在這種情況下,只需調(diào)用Bucket.Cursor(),它返回一個(gè)游標(biāo)值,它有Next()、Prev()等函數(shù),它們返回鍵/值對(duì),并像您預(yù)期的那樣工作。

bolt API還有很多內(nèi)容,但剩下的大部分內(nèi)容都是關(guān)于數(shù)據(jù)庫(kù)統(tǒng)計(jì)和一些更高級(jí)使用場(chǎng)景內(nèi)容……但要開(kāi)始在bolt數(shù)據(jù)庫(kù)中存儲(chǔ)數(shù)據(jù),上述內(nèi)容就是你真正需要知道的。

4. 總結(jié)

對(duì)于更復(fù)雜的應(yīng)用程序,僅在數(shù)據(jù)庫(kù)中存儲(chǔ)字符串可能不夠,但這沒(méi)關(guān)系,Go的編碼相關(guān)包可以幫忙。你可以很容易地使用encoding/json或encoding/gob將結(jié)構(gòu)序列化到數(shù)據(jù)庫(kù)中,以唯一的名稱(chēng)或id作為鍵。再者bolt的好處是較低的使用門(mén)檻,不需要找出整個(gè)數(shù)據(jù)庫(kù)模式或安裝任何東西,就可以以高性能、可管理的方式將數(shù)據(jù)存儲(chǔ)至磁盤(pán)。

bolt的主要缺點(diǎn)是沒(méi)有查詢(xún)。你不能要求:給我所有以bar開(kāi)頭foo對(duì)象。您可以在數(shù)據(jù)庫(kù)中創(chuàng)建自己的索引,并手動(dòng)保持其更新。這很簡(jiǎn)單,只需為特定查詢(xún)將IDs切片(slice)序列化到“indices”桶中即可。顯然這是開(kāi)始開(kāi)發(fā)自己關(guān)系數(shù)據(jù)庫(kù)的領(lǐng)域,但是如果你不打算做得太過(guò)火,那么所有這些代碼就夠了。那些外部DSL中的查詢(xún)只是為內(nèi)存中數(shù)據(jù)存儲(chǔ)編寫(xiě)的代碼。

Bolt并非適用于所有應(yīng)用。你必須了解應(yīng)用程序的需求,以及bolt的鍵/值樣式是否足以滿(mǎn)足這些需求。如果是這樣,我想你會(huì)非常樂(lè)意使用簡(jiǎn)單的數(shù)據(jù)存儲(chǔ)系統(tǒng),而無(wú)需太多的腦力開(kāi)銷(xiāo)。

以上就是Golang高性能持久化解決方案BoltDB數(shù)據(jù)庫(kù)介紹的詳細(xì)內(nèi)容,更多關(guān)于Golang持久化BoltDB的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • GO語(yǔ)言實(shí)現(xiàn)標(biāo)題閃爍效果

    GO語(yǔ)言實(shí)現(xiàn)標(biāo)題閃爍效果

    這篇文章主要介紹了GO語(yǔ)言實(shí)現(xiàn)標(biāo)題閃爍效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Golang性能優(yōu)化的技巧分享

    Golang性能優(yōu)化的技巧分享

    性能優(yōu)化的前提是滿(mǎn)足正確可靠、簡(jiǎn)潔清晰等質(zhì)量因素,針對(duì)?Go語(yǔ)言特性,本文為大家整理了一些Go語(yǔ)言相關(guān)的性能優(yōu)化建議,感興趣的可以了解一下
    2023-07-07
  • 利用Golang如何調(diào)用Linux命令詳解

    利用Golang如何調(diào)用Linux命令詳解

    這篇文章主要給大家介紹了Golang中使用os/exec來(lái)執(zhí)行 Linux 命令的相關(guān)資料,文中給出了詳細(xì)的示例代碼,對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-05-05
  • Go語(yǔ)言之Goroutine與信道異常處理

    Go語(yǔ)言之Goroutine與信道異常處理

    這篇文章主要給大家介紹得是Go語(yǔ)言Goroutine與信道異常處理,Goroutine 之間通信是通過(guò) channel 通信的,想詳細(xì)了解得小伙伴跟小編一起來(lái)學(xué)習(xí)下面文章內(nèi)容吧
    2021-10-10
  • go panic時(shí)如何讓函數(shù)返回?cái)?shù)據(jù)?

    go panic時(shí)如何讓函數(shù)返回?cái)?shù)據(jù)?

    今天小編就為大家分享一篇關(guān)于go panic時(shí)如何讓函數(shù)返回?cái)?shù)據(jù)?,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-04-04
  • 詳解go語(yǔ)言中type關(guān)鍵詞的幾種使用

    詳解go語(yǔ)言中type關(guān)鍵詞的幾種使用

    這篇文章主要介紹了詳解go語(yǔ)言中type的幾種使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Golang 錯(cuò)誤捕獲Panic與Recover的使用

    Golang 錯(cuò)誤捕獲Panic與Recover的使用

    對(duì)于Go語(yǔ)言的錯(cuò)誤是通過(guò)返回值的方式,本文主要介紹了Golang 錯(cuò)誤捕獲Panic與Recover的使用,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • go語(yǔ)言數(shù)組及結(jié)構(gòu)體繼承和初始化示例解析

    go語(yǔ)言數(shù)組及結(jié)構(gòu)體繼承和初始化示例解析

    這篇文章主要為大家介紹了go語(yǔ)言數(shù)組及結(jié)構(gòu)體繼承和初始化示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Golang排列組合算法問(wèn)題之全排列實(shí)現(xiàn)方法

    Golang排列組合算法問(wèn)題之全排列實(shí)現(xiàn)方法

    這篇文章主要介紹了Golang排列組合算法問(wèn)題之全排列實(shí)現(xiàn)方法,涉及Go語(yǔ)言針對(duì)字符串的遍歷及排列組合相關(guān)操作技巧,需要的朋友可以參考下
    2017-01-01
  • 詳解Golang中下劃線(xiàn)的使用方法

    詳解Golang中下劃線(xiàn)的使用方法

    這篇文章主要介紹了詳解Golang中下劃線(xiàn)的使用方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01

最新評(píng)論