嵌入式K/V数据处理库-BoltDB
2018-11-14 14:34:43 阿炯

BoltDB是一个嵌入式key/value的数据库,即只需要将其链接到应用程序代码中即可使用BoltDB提供的API来高效的存取数据。而且BoltDB支持完全可序列化的ACID事务,让应用程序可以更简单的处理复杂操作。采用Go语言开发并在MIT协议下授权。


BoltDB设计源于LMDB,具有以下特点:
直接使用API存取数据,没有查询语句;
支持完全可序列化的ACID事务,这个特性比LevelDB强;
数据保存在内存映射的文件里。没有wal、线程压缩和垃圾回收;
通过COW技术,可实现无锁的读写并发,但是无法实现无锁的写写并发,这就注定了读性能超高,但写性能一般,适合与读多写少的场景。

BoltDB使用Golang开发,灵感来自于Howard Chu的LMDB项目。该项目目标是开发一个简单、快速、可靠的无服务端的数据库。API非常小巧和简洁,仅仅关注如何获取或设置数据,这就是全部。BoltDB是K-V存储,没有关系型数据库中类似表、行、列结构,数据以key-value对存储(类似GO语言中的map) 。相似的key-value对存储在同一bucket中,类似于关系型数据库中的Table。因此为了获取一个value,需要知道其所在的bucket以及对应的key。被应用于influxDB项目作为底层存储(从0.9版本开始,原为LevelDB)。


LevelDB是一个由Google公司所研发的键/值对(Key/Value Pair)嵌入式数据库管理系统编程库。BoltDB支持完全可序列化的ACID事务,也不同于SQLlite,BoltDB没有查询语句,对于用户而言更加易用。BoltDB将数据保存在一个单独的内存映射的文件里。它没有wal、线程压缩和垃圾回收,它仅仅安全地处理一个文件。

LevelDB和BoltDB的不同

LevelDB是Google开发的,也是一个k/v的存储数据库,和BoltDB比起起来有很大的不同。对于使用者而言,最大的不同就是LevelDB没有事务。在其内部,也有很多的不同:LevelDB实现了一个日志结构化的merge tree。它将有序的key/value存储在不同文件的之中,并通过“层级”把它们分开,并且周期性地将小的文件merge为更大的文件。这让其在随机写的时候会很快,但是读的时候却很慢。这也让LevelDB的性能不可预知:但数据量很小的时候,它可能性能很好,但是当随着数据量的增加,性能只会越来越糟糕。而且做merge的线程也会在服务器上出现问题。LevelDB是C++写的,但是也有些Go的实现方式,如syndtr/goleveldb、leveldb-go。

BoltDB使用一个单独的内存映射的文件,实现一个写入时拷贝的B+树,这能让读取更快。而且BoltDB的载入时间很快,特别是在从crash恢复的时候,因为它不需要去通过读log(其实它压根也没有)去找到上次成功的事务,它仅仅从两个B+树的根节点读取ID。

最新版本:


官方主页:https://boltdb.cn/

项目主页:https://github.com/boltdb/bolt