GoLang BoltDB数据库详解

 更新时间:2023年02月03日 09:28:30   作者:raoxiaoya  
这篇文章主要介绍了GoLang BoltDB数据库,boltdb是使用Go语言编写的开源的键值对数据库,boltdb存储数据时 key和value都要求是字节数据,此处需要使用到 序列化和反序列化

说明

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

到此这篇关于GoLang BoltDB数据库详解的文章就介绍到这了,更多相关Go BoltDB内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文带你掌握Golang中的类型断言

    一文带你掌握Golang中的类型断言

    类型断言是 Golang 中的一个非常重要的特性,使用类型断言可以判断一个接口的实际类型是否是预期的类型,以便进行对应的处理,下面就跟随小编一起深入了解一下Golang中的类型断言吧
    2024-01-01
  • 深入理解 Go 语言中的 Context

    深入理解 Go 语言中的 Context

    这篇文章主要介绍了 理解 Go 语言中的 Context,需要的朋友可以参考下
    2020-06-06
  • zap接收gin框架默认的日志并配置日志归档示例

    zap接收gin框架默认的日志并配置日志归档示例

    本文介绍了在基于gin框架开发的项目中如何配置并使用zap来接收并记录gin框架默认的日志和如何配置日志归档。有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-04-04
  • Go语言流程控制详情

    Go语言流程控制详情

    这篇文章主要介绍了Go语言流程控制详情,流程控制包含分三大类:条件判断,循环控制和无条件跳转。下面关于更多相关内容需要的小伙伴可以参考一下
    2022-03-03
  • Golang模拟令牌桶进行对访问的限流方式

    Golang模拟令牌桶进行对访问的限流方式

    这篇文章主要介绍了Golang模拟令牌桶进行对访问的限流方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Golang你一定要懂的连接池实现

    Golang你一定要懂的连接池实现

    这篇文章主要介绍了Golang你一定要懂的连接池实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Golang实现支持多种类型的set

    Golang实现支持多种类型的set

    在项目开发中,常常会用到set去重,为什么不写一个set呢,而且go现在支持了泛型,所以本文就来用Golang实现一个支持多种类型的set呢
    2023-05-05
  • Golang中int, int8, int16, int32, int64和uint区别浅析

    Golang中int, int8, int16, int32, int64和uint区别浅析

    go语言中的int的大小是和操作系统位数相关的,如果是32位操作系统,int类型的大小就是4字节,如果是64位操作系统,int类型的大小就是8个字节,下面这篇文章主要给大家介绍了关于Golang中int, int8, int16, int32, int64和uint区别的相关资料,需要的朋友可以参考下
    2022-11-11
  • Go 语言入门之net/url 包

    Go 语言入门之net/url 包

    这篇文章主要介绍了Go 语言入门之net/url 包,文章基于GO语言的相关资料展开 net/url 包的详细内容,具有一定的的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • Go语言基础函数基本用法及示例详解

    Go语言基础函数基本用法及示例详解

    这篇文章主要为大家介绍了Go语言基础函数基本用法及示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-11-11

最新评论