日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

GoLang?BoltDB數據庫詳解_Golang

作者:raoxiaoya ? 更新時間: 2023-04-03 編程語言

說明

Bolt是一個純粹Key/Value模型的程序。該項目的目標是為不需要完整數據庫服務器(如Postgres或MySQL)的項目提供一個簡單,快速,可靠的數據庫。

BoltDB只需要將其鏈接到你的應用程序代碼中即可使用BoltDB提供的API來高效的存取數據。而且BoltDB支持完全可序列化的ACID事務,讓應用程序可以更簡單的處理復雜操作。

BoltDB設計源于LMDB,具有以下特點:

  • 使用Go語言編寫
  • 不需要服務器即可運行
  • 支持數據結構
  • 直接使用API存取數據,沒有查詢語句
  • 支持完全可序列化的ACID事務,這個特性比LevelDB強
  • 數據保存在內存映射的文件里。沒有wal、線程壓縮和垃圾回收
  • 通過COW技術,可實現無鎖的讀寫并發,但是無法實現無鎖的寫寫并發,這就注定了讀性能超高,但寫性能一般,適合與讀多寫少的場景

BoltDB是一個Key/Value(鍵/值)存儲,這意味著沒有像SQL RDBMS(MySQL,PostgreSQL等)中的表,沒有行,沒有列。相反,數據作為鍵值對存儲(如在Golang Maps中)。鍵值對存儲在Buckets中,它們旨在對相似的對進行分組(這與RDBMS中的表類似)。因此,為了獲得Value(值),需要知道該Value所在的桶和鑰匙。

go get -u github.com/boltdb/bolt

打開數據庫

db, err := bolt.Open(dbfile, 0600, nil)
if err != nil {
    log.Fatal(err)
}
defer db.Close()

更新事務

err := db.Update(func(tx *bolt.Tx) error {
    ...
    return nil
})

說明:

  • 通過該接口可以實現數據更新操作該操作
  • 會被當做一個事務來處理,如果Update()內的操作返回nil,則事務會被提交,否則事務會回滾

只讀操作

err := db.View(func(tx *bolt.Tx) error {
    ...
    return nil
})

說明:

通過該接口可以且只能進行數據查詢操作 批量更新事務

err := db.Batch(func(tx *bolt.Tx) error {
    ...
    return nil
})

說明:

  • 通過該接口可以實現多次數據更新操作
  • 所有的更新會被當做一個事務來處理,如果Update()內的操作返回nil,則事務會被提交,否則事務會回滾

手動事務管理

// 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
}

說明:

自己創建事務,并管理事務的提交和回滾,沒有利用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
	})
}

原文鏈接:https://blog.csdn.net/raoxiaoya/article/details/125314930

欄目分類
最近更新