今日谈:BoltDB数据库,一款纯Go实现的KV数据库
作者:ReganYue
来源:恒生LIGHT云社区
一、什么是BoltDB
这是一款纯粹使用Go语言编写的key/value数据库,据说它是参考了开源的内存映射数据库LMDB。值得注意的是,这款数据库不支持网络连接,也没有复杂的SQL语句查询支持。但是它在Go的应用中能够比较方便的来达到数据持久化。
二、使用场景
- Go语言编写的程序,这个程序需要内嵌数据库。
- 不需要复杂的SQL语句查询。
- 这款数据库更擅长读的操作,所以在读多写少的场景下,它效果比较好。
三、安装及使用方法
安装方法很简单,就是在命令行执行:
go get github.com/boltdb/bolt/...
那么我们如何打开数据库呢?我们来看一看下面这段代码。
package mainimport ("log""github.com/boltdb/bolt"
)func main() {// Open the my.db data file in your current directory.// It will be created if it doesn't exist.db, err := bolt.Open("my.db", 0600, nil)if err != nil {log.Fatal(err)}defer db.Close()...
}
这个 bolt.Open()是在给定的路径上打开数据库。如果要打开的数据库文件不存在,则将自动创建该文件。**
**第二个参数是文件模式。第三个参数传入nil值就让Bolt使用默认选项打开数据库。
Bolt 多个进程无法同时打开同一个数据库。打开一个已经打开的 Bolt 数据库会导致它挂起,直到另一个进程关闭它。为了防止无限期等待,我们需要给 Open()
函数一个超时参数:
db, err := bolt.Open("my.db", 0600, &bolt.Options{Timeout: 1 * time.Second})
事务
Bolt一次只支持一个读写事务,但是一次可以支持多个只读事务。
用于读写的事务API是Update,二用于读的事务API是View。
err := db.Update(func(tx *bolt.Tx) error {...return nil
})
err := db.View(func(tx *bolt.Tx) error {...return nil
})
注意:只读事务和读写事务通常不应同时在同一个 goroutine 中打开。这可能会导致死锁,因为读写事务需要定期重新映射数据文件,但在只读事务打开时无法这样做。
还有一种****Batch事务****可以减小并发写操作的开销。Batch 仅在有多个 goroutine 调用它时才有用。
err := db.Batch(func(tx *bolt.Tx) error {...return nil
})
读写操作
db.Update(func(tx *bolt.Tx) error {b := tx.Bucket([]byte("MyBucket"))err := b.Put([]byte("answer"), []byte("42"))return err
})
这是往数据库中写入键为answer值为42的数据。
db.View(func(tx *bolt.Tx) error {b := tx.Bucket([]byte("MyBucket"))v := b.Get([]byte("answer"))fmt.Printf("The answer is: %s\n", v)return nil
})
这是读取键为answer的数据。
是不是发现有个tx.Bucket()不知道是干什么的呢?
Bolt有个很有意思的地方就是这个Bucket,这个是这个数据库组织数据的基本方式,比如有一个Bucket叫公司,这个Bucket里面还建一个Bucket叫部门,里面建一个key:ReganYue,这就说明ReganYue是这个部门里面的人,但是同时也是这个公司里面的人,这个key属于部门这个Bucket,也属于公司这个Bucket。
今日谈:BoltDB数据库,一款纯Go实现的KV数据库相关推荐
- Hypersonic SQL开源数据库方向比较流行的纯Java开发的关系型数据库
Hypersonic SQL Hypersonic SQL开源数据库方向比较流行的纯Java开发的关系型数据库.好像不是JDBC兼容的,JDBC的很多高级的特性都没有支持,不过幸好支持ANSI- 92 ...
- mysql做kv数据库_从零开始写KV数据库:基于哈希索引
前言 新的KV数据库层出不穷,我们经常听说的KV数据库如RocksDb.Hbase等都是基于日志结构的存储引擎.最近我在看<数据密集型应用系统设计>,里面有一章专门在讲日志结构的存储引擎的 ...
- mysql做kv数据库_如何将SQL数据映射到KV数据库
日常吐槽 国外文章也不是都是好文章啊,不要见到英文就觉得高大上了-- 前言 越来越多的关系型数据库底层选择基于KV构建,例如TiDB的TiKV(RocksDB),cockroach的levelDB,M ...
- H2:一款基于 Java 的嵌入式关系型数据库
文章目录 H2 简介 下载安装 执行 SQL 语句 查看帮助 运行 SQL 脚本 生成 DDL 语句 断开数据库连接 连接模式 命令行客户端 Maven 依赖 资源文档 总结 大家好,我是只谈技术不剪 ...
- BoltDB 一个简单的纯 Go key/value 存储 [译]
作者:wolf4j 链接:https://www.jianshu.com/p/cb1b05aa7dd2 boltDB Blot Bolt 是由 Howard Chu 的 LMDB 项目启发的一个纯粹的 ...
- SQL Studio:一款纯Web化SQL开发工具,关键是免安装还免费!
经常使用SQL工具的开发者对Navicat一定都不陌生.这款软件作为一款全球化的多数据库管理工具,这些年逐步得到全国各地SQLer(SQL开发者)的关注. 与其他很多外来的软件产品一样,由于价格原因, ...
- python数据库应用开发实例_纯Python开发的nosql数据库CodernityDB介绍和使用实例
看看这个logo,有些像python的小蛇吧 .这次介绍的数据库codernityDB是纯python开发的. 先前用了下tinyDB这个本地数据库,也在一个api服务中用了下,一开始觉得速度有些不给 ...
- 推荐10款纯css3实现的实用按钮
在2014年的双11即将来临之季,爱编程小编为大家整理10款纯css3实现的按钮.希望这对坚守在前端的码农们有所帮助.亲,如果你有好的资源也可在本文留言,让从事编码的程序员们抱团.工作更轻松. No1 ...
- 一款纯css3实现的响应式导航
之前为大家介绍了好几款响应式导航.今天再给大家带来一款纯css3实现的响应式导航.这款导航还有个响应式的搜索框.废话少说,直接上图: 在线预览 源码下载 实现的代码. html代码: <di ...
最新文章
- mvc ajax提交html标签,asp.net-mvc – 如何使用ajax get或post在带有参数的mvc中将数据从View传递到Controller...
- struts2 iterator list中对象的list 双层迭代
- 几种TCP连接中出现RST的情况
- STORM_0001_用vmware拷贝出三个相同的ubuntu搭建小的zookeeper集群
- python开发bs系统_基于BS架构的招聘管理系统的开发
- 不会Nacos的配置中心?你怎么敢的呀!如何一步步实现Nacos作为服务的配置中心(全网最详系列)
- Spring boot系列--redis使用之1
- mysql user表空_Mysql User表为空
- Linux下conda镜像源配置
- i18n国际化资源配置各个国家语言汇总
- Tableau学习摘录总结①(层次、聚合度和颗粒度层次、聚合度和颗粒度,字段(离散和连续),小建议)
- 【PAT】PAT那些破事
- PayPal贝宝集成
- 从零开始学Java编程!java数据结构面试题
- QVariant方法功能(QT5.12)
- 怎么提取抖音里的音乐制作手机铃声
- DEM数据(ASTER GDEM|SRTM|GLS2005|ALOS DEM|NASA DEM)下载
- k-近邻算法 解决 动态字体反爬
- JavaScript中shift() 方法
- 开单大师房产中介管理系统源码服务器及安装配置方式
热门文章
- 解决spyder无法打开问题
- 机械键盘测试——《万历十五年》2
- 尚硅谷大数据hadoop教程_mapReduce
- mms彩信发送 java_MMSDemo android彩信发送模块,实现了 的加密 接收,解密查看等功能。 238万源代码下载- www.pudn.com...
- 巴塔机器人_《超级机器人大战V》全SR流程攻略
- android 暴风影音目录,手机暴风影音缓存文件存储位置在哪 怎么找到手机暴风影音缓存文件...
- ---中南海香烟---系列[男人应该抽的烟]
- 史上最全,程序员必须掌握的400个编程英语词汇
- M.2 SSD接口详解
- 【小白入门】2019 ICME2019 字节跳动 • 短视频内容理解与推荐竞赛