blot数据库007

2023-11-02 20:59
文章标签 数据库 007 blot

本文主要是介绍blot数据库007,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

blot数据库go的专属

思路: 找到数据库名字 -->找到blockbucket---->put或者读数据库

package mainimport ("fmt""github.com/boltdb/bolt""log"
)func main()  {//1 打开数据库db,err:=bolt.Open("test.db",0660,nil)defer db.Close()  //关闭数据库if err!=nil{log.Panic("打开数据库失败")}//2 查看数据库是否存在db.Update(func(tx *bolt.Tx) error {bucket:=	tx.Bucket([]byte("b1"))//如果等于nil 需要创建if bucket==nil{bucket,err=tx.CreateBucket([]byte("b1"))if err!=nil{log.Panic("创建失败")}}//3 写数据bucket.Put([]byte("11111"),[]byte("hello"))bucket.Put([]byte("2222"),[]byte("world"))return nil})//4 读数据db.View(func(tx *bolt.Tx) error {//1 找到抽屉 没有的话直接报错退出bucket:= tx.Bucket([]byte("b1"))if bucket==nil{log.Panic("bucket不应该为空请检查")}//2 直接读取数据v1:=bucket.Get([]byte("11111"))v2:=bucket.Get([]byte("2222"))fmt.Printf("v1 %s\n",v1)fmt.Printf("v2 %s\n",v2)return nil})}

BlotDB简介

Bolt是一个go语言实现的纯粹的 key /value存储,受到Howard Chu的 LMDB项目的启发。该项目的目标是为不需要完整数据库服务器(如Postgres或MySQL)的项目提供简单,快速,可靠的数据库。
Bolt它很小,只关注值的设置和读取。Bolt虽小但是很稳定,它能够用于高负载生产环境。

安装Blot

Blot仅在Go中使用,所以使用前请先安装Go,然后使用go get

$ go get github.com/boltdb/bolt / ...
  •  

创建或打开数据库

db, err := bolt.Open("my.db", 0600, nil)
  •  

Open 的第一个参数为路径,如果数据库不存在则会创建名为my.db的数据库, 第二个参数为文件操作权限,第三个参数是可选参数, 内部可以配置只读和超时时间等。 特别需要注意的地方就是因为boltdb是文件操作类型的数据库,所以只能单点写入和读取,如果多个同时操作的话后者会被挂起直到前者关闭操作为止。

关闭数据库

调用数据库、I/O这类 ,随用随关是个好习惯。

defer db.Close()
  •  

读写事务

boltdb的读写事务操作我们可以使用DB.Update()来完成。

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

创建桶(表)

既然说到读写事务,我们当然得实战演练一下,首先我们就来创建一个桶。

db.Update(func(tx *bolt.Tx) error {	b,err:=tx.CreateBucketIfNotExists([]byte("bucket"))if err!=nil{return  err}return nil})

上面我们使用了tx.CreateBucketIfNotExists( )来创建了一个桶,该函数会先判断桶是否存在,如果不存在会自动创建。我们也可用使用tx.CreateBucket([]byte(“bucket”)) 来完成bucket桶的创建

使用Put()设置值

db.Update(func(tx *bolt.Tx) error {	err:=tx.CreateBucketIfNotExists([]byte("bucket"))if err!=nil{return  err}err = b.Put([]byte("name"), []byte("Jay"))return err})

这里我们使用了Put() 设置 key 为name ,value 为Jay

删除桶

删除桶可以使用Tx.DeleteBucket()来完成

db.Update(func(tx *bolt.Tx) error {	err:=tx.DeleteBucket([]byte("bucket"))if err!=nil{return  err}return nil})

桶的嵌套

func (*Bucket) CreateBucket(key []byte) (*Bucket, error)
  • 1

当然使用CreateBucketIfNotExists函数也是可以的

只读事务

小伙伴们现在肯定迫不及待的想要知道怎么获取name的值吧?别急我们先来看看只读事务

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

使用Get()获取值

db.View(func(tx *bolt.Tx) error {b:=tx.Bucket([]byte("bucket"))v:=b.Get([]byte("name"))fmt.Println(“name=”+v)return  nil
})
  • Bucket

使用游标

boltdb以桶中的字节排序顺序存储键。这使得在这些键上的顺序迭代非常快。要遍历键,我们将使用游标Cursor():

db.View(func(tx *bolt.Tx) error {// Assume bucket exists and has keysb := tx.Bucket([]byte("MyBucket"))c := b.Cursor()for k, v := c.First(); k != nil; k, v = c.Next() {fmt.Printf("key=%s, value=%s\n", k, v)}return nil
})

游标Cursor()允许您移动到键列表中的特定点,并一次一个地通过操作键前进或后退。
光标上有以下函数:

First() 移动到第一个健.
Last() 移动到最后一个健.
Seek() 移动到特定的一个健.
Next() 移动到下一个健.
Prev() 移动到上一个健.

使用ForEach

如果你知道所在桶中拥有键,你也可以使用ForEach()来迭代:

db.View(func(tx *bolt.Tx) error {// Assume bucket exists and has keysb := tx.Bucket([]byte("MyBucket"))b.ForEach(func(k, v []byte) error {fmt.Printf("key=%s, value=%s\n", k, v)return nil})return nil
})

范围查询

Bolt也可以在两个值之间遍历查询,如两个时间直接、数字之间等。

db.View(func(tx *bolt.Tx) error {// Assume our events bucket exists and has RFC3339 encoded time keys.c := tx.Bucket([]byte("Events")).Cursor()// Our time range spans the 90's decade.min := []byte("1990-01-01T00:00:00Z")max := []byte("2018-01-01T00:00:00Z")// Iterate over the 90's.for k, v := c.Seek(min); k != nil && bytes.Compare(k, max) <= 0; k, v = c.Next() {fmt.Printf("%s: %s\n", k, v)}return nil
})

桶的自增

利用nextsequence()功能,你可以让boltdb生成序列作为你键值对的唯一标识。

func (s *Store) CreateUser(u *User) error {return s.db.Update(func(tx *bolt.Tx) error {// 创建users桶b := tx.Bucket([]byte("users"))// 生成自增序列id, _ = b.NextSequence()u.ID = int(id)// Marshal user data into bytes.buf, err := json.Marshal(u)if err != nil {return err}// Persist bytes to users bucket.return b.Put(itob(u.ID), buf)})
}// itob returns an 8-byte big endian representation of v.
func itob(v int) []byte {b := make([]byte, 8)binary.BigEndian.PutUint64(b, uint64(v))return b
}type User struct {ID int...
}

批量读写事务

每一次新的事物都需要等待上一次事物的结束,这种开销我们可以通过DB.Batch()批处理来完成。在批处理过程中如果某个事务失败了,批处理会多次调用这个函数函数返回成功则成功。如果中途失败了,则整个事务会回滚。

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

这篇关于blot数据库007的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/333278

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中, "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时,经常听到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及 BCNF(Boyce-Codd范式)。这些范式都旨在通过消除数据冗余和异常来优化数据库结构。然而,当我们谈到 4NF(第四范式)时,事情变得更加复杂。本文将带你深入了解 多值依赖 和 4NF,帮助你在数据库设计中消除更高级别的异常。 什么是

DM8数据库安装后配置

1 前言 在上篇文章中,我们已经成功将库装好。在安装完成后,为了能够更好地满足应用需求和保障系统的安全稳定运行,通常需要进行一些基本的配置。下面是一些常见的配置项: 数据库服务注册:默认包含14个功能模块,将这些模块注册成服务后,可以更好的启动和管理这些功能;基本的实例参数配置:契合应用场景和发挥系统的最大性能;备份:有备无患;… 2 注册实例服务 注册了实例服务后,可以使用系统服务管理,

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争

开源分布式数据库中间件

转自:https://www.csdn.net/article/2015-07-16/2825228 MyCat:开源分布式数据库中间件 为什么需要MyCat? 虽然云计算时代,传统数据库存在着先天性的弊端,但是NoSQL数据库又无法将其替代。如果传统数据易于扩展,可切分,就可以避免单机(单库)的性能缺陷。 MyCat的目标就是:低成本地将现有的单机数据库和应用平滑迁移到“云”端

ORACLE 11g 创建数据库时 Enterprise Manager配置失败的解决办法 无法打开OEM的解决办法

在win7 64位系统下安装oracle11g,在使用Database configuration Assistant创建数据库时,在创建到85%的时候报错,错误如下: 解决办法: 在listener.ora中增加对BlueAeri-PC或ip地址的侦听,具体步骤如下: 1.启动Net Manager,在“监听程序”--Listener下添加一个地址,主机名写计

MyBatis 切换不同的类型数据库方案

下属案例例当前结合SpringBoot 配置进行讲解。 背景: 实现一个工程里面在部署阶段支持切换不同类型数据库支持。 方案一 数据源配置 关键代码(是什么数据库,该怎么配就怎么配) spring:datasource:name: test# 使用druid数据源type: com.alibaba.druid.pool.DruidDataSource# @需要修改 数据库连接及驱动u

CentOS下mysql数据库data目录迁移

https://my.oschina.net/u/873762/blog/180388        公司新上线一个资讯网站,独立主机,raid5,lamp架构。由于资讯网是面向小行业,初步估计一两年内访问量压力不大,故,在做服务器系统搭建的时候,只是简单分出一个独立的data区作为数据库和网站程序的专区,其他按照linux的默认分区。apache,mysql,php均使用yum安装(也尝试

Java基础回顾系列-第九天-数据库编程

Java基础回顾系列-第九天-数据库编程 数据库简介工具包java.sql API 内容与数据库建立连接执行SQL语句数据库检索和更新查询结果SQL类型对应Java类型映射元数据异常 API方法DriverManagerConnectionStatementPreparedStatementCallableStatementResultSetjava.sql.Date批处理、存储过程、事务