BoltDB,RocksDB,PebbleDB,BadgerDb简介及测评

article/2025/10/13 2:05:19

几个常用数据库性能分析

​ 最近公司需要选型一款单机KV数据库来做业务承载,所以我对比了目前市面上比较流行的几个KV数据库并记录下来,包括boltdb,rocksdb,pebbledb,badgerdb四款,我将简单分析一下各数据库的特点,最后用自己的简单测试程序跑一下各数据库。对比一下性能差异

boltdb

github地址:https://github.com/boltdb/bolt Star:11.7k Fork:1.5K

最后 Merge pull request 时间是2018年3月,很久没有维护了。

代码量:

在这里插入图片描述
特点

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

与其他数据对比

LevelDB,RocksDB

LevelDB及其派生类(RocksDB,HyperLevelDB)与Bolt类似,因为它们是捆绑到应用程序中的库,但是它们的底层结构是日志结构的合并树(LSM树)。LSM树通过使用预写日志和称为SSTables的多层排序文件来优化随机写入。Bolt在内部使用B +树,并且仅使用一个文件。两种方法都需要权衡。 如果您需要较高的随机写入吞吐量(> 10,000 w / sec),或者需要使用旋转磁盘,那么LevelDB可能是一个不错的选择。如果您的应用程序是大量读取或进行大量范围扫描,那么Bolt可能是一个不错的选择。 另一个重要的考虑因素是LevelDB没有事务。它支持键/值对的批量写入,并且支持读取快照,但不能使您安全地执行比较和交换操作。Bolt支持完全可序列化的ACID事务。

LMDB

Bolt最初是LMDB的端口,因此在架构上相似。两者都使用B +树,具有ACID语义和完全可序列化的事务,并支持使用单个写入器和多个读取器的无锁MVCC。 这两个项目有些分歧。LMDB专注于原始性能,而Bolt专注于简单性和易用性。例如,出于性能考虑,LMDB允许执行几种不安全的操作,例如直接写入。Bolt选择禁止可能使数据库处于损坏状态的操作。Bolt唯一的例外是DB.NoSync。 API也有一些区别。打开LMDB时需要最大的mmap大小,mdb_env而Bolt会自动处理增量mmap的大小。LMDB使用多个标志来重载getter和setter函数,而Bolt将这些特殊情况拆分为自己的函数。

注意事项和局限性

选择合适的工具来完成这项工作很重要,而Bolt也不例外。在评估和使用Bolt时,需要注意以下几点:

  • Bolt非常适合读取密集型工作负载。顺序写入性能也很快,但是随机写入可能会很慢。您可以使用DB.Batch()或添加预写日志来帮助缓解此问题。
  • Bolt在内部使用B + tree,因此可以有很多随机页面访问。与旋转磁盘相比,SSD可以显着提高性能。
  • 尝试避免长时间运行的读取事务。Bolt使用写时复制功能,因此在旧事务使用旧页时无法回收这些旧页。
  • 从Bolt返回的字节片仅在事务期间有效。一旦事务被提交或回滚,它们所指向的内存就可以被新页面重用,或者可以从虚拟内存中取消映射,unexpected fault address访问时会出现恐慌。
  • Bolt在数据库文件上使用排他写锁定,因此不能被多个进程共享。
  • 使用时要小心Bucket.FillPercent。为具有随机插入的存储桶设置较高的填充百分比将导致数据库的页面利用率非常差。
  • 通常使用较大的水桶。较小的存储桶一旦超过页面大小(通常为4KB),就会导致页面利用率下降。
  • 批量加载大量随机写入新的存储桶可能很慢,因为在提交事务之前页面不会拆分。建议不要在单个事务中将100,000个以上的键/值对随机插入到一个新的存储桶中。
  • Bolt使用内存映射文件,因此底层操作系统可以处理数据的缓存。通常,操作系统将在内存中缓存尽可能多的文件,并根据需要将内存释放给其他进程。这意味着在使用大型数据库时,Bolt可能会显示很高的内存使用率。但是,这是预料之中的,操作系统将根据需要释放内存。只要Bolt的内存映射适合进程虚拟地址空间,它就可以处理比可用物理RAM大得多的数据库。在32位系统上可能会出现问题。
  • Bolt数据库中的数据结构是内存映射的,因此数据文件将是特定于字节序的。这意味着您无法将Bolt文件从小字节序计算机复制到大字节序计算机并使其正常工作。对于大多数用户而言,这不是问题,因为大多数现代CPU的字节序都很少。
  • 由于页面在磁盘上的布局方式,Bolt无法截断数据文件并将可用页面返回到磁盘。取而代之的是,Bolt会在其数据文件中维护未使用页面的空闲列表。这些空闲页面可以被以后的事务重用。由于数据库通常会增长,因此这在许多用例中效果很好。但是,请务必注意,删除大块数据将不允许您回收磁盘上的该空间。

RocksDB

github地址:https://github.com/facebook/rocksdb/ Star:16.9K Fork:4.4K

C++编写,现在还在维护

代码量:
在这里插入图片描述

特点

​ RocksDB最初的设计理念就是其应该在高速存储设备以及服务器压力下能有很好的性能表现。他应该能榨取Flash或者RAM子系统提供的所有读写速度潜能。他应该能支持高速的点查询和区间查询。可以通过配置支持很高的随机查询负荷,很高的更新负荷或者两者兼有。其架构应能很简单地对读放大,写放大和存储空间放大进行调优。go程序使用需要用到包装库gorocksdb

​ RocksDB文档很齐全,可以看官方文档介绍


PebbleDB

github地址:https://github.com/cockroachdb/pebble Star:1.9K Fork:124

纯go编写,现在还在维护

该项目是由cockroach工作室进行维护,pebbledb基础是levelsdb,然后把rocksdb的部分功能用go移植并对某些功能进行优化。

代码量

在这里插入图片描述

特点

​ 此db可以堪称rocksdb的go语言版本,但只实现了rocksdb的部分功能,也增加了一些rocksdb没有的功能和优化,可以看下github上的项目介绍。


BadgerDB

github地址:https://github.com/dgraph-io/badger Star:9.1K Fork:756

纯go编写,现在还在维护

下面是作者对此的介绍

Badger was written with these design goals in mind:

  • Write a key-value database in pure Go.
  • Use latest research to build the fastest KV database for data sets spanning terabytes.
  • Optimize for SSDs.

Badger’s design is based on a paper titled WiscKey: Separating Keys from Values in SSD-conscious Storage.

代码量
在这里插入图片描述

特点:

​ badgerdb对key,value进行了分别的处理,只把key存到了lms结构,value是用的Log文件进行处理,适合key小value大的情况。

Badgerdb官网提供了一个功能对比

FeatureBadgerRocksDBBoltDB
DesignLSM tree with value logLSM tree onlyB+ tree
High Read throughputYesNoYes
High Write throughputYesYesNo
Designed for SSDsYes (with latest research 1)Not specifically 2No
EmbeddableYesYesYes
Sorted KV accessYesYesYes
Pure Go (no Cgo)YesNoYes
TransactionsYes, ACID, concurrent with SSI3Yes (but non-ACID)Yes, ACID
SnapshotsYesYesYes
TTL supportYesYesNo
3D access (key-value-version)Yes4NoNo

数据测试

测试代码地址为:https://github.com/huxinhuxin/kvtest

测试说明:

设定假如设定N次(启动参数-a决定,默认为1000),将会依次执行后续操作:

  1. 顺序N次写
  2. 随机读N次
  3. 随机删N次
  4. 随机写N次
  5. 遍历所有Key

KV全都是默认配置,现在都是单线程运行,sync属性都设置为true

N=10000

顺序写随机读随机删随机写遍历key总耗时
Boltdb2.498 s39.848 ms2.713 s2.881 s917.552µs8.137 s
pebbledb1.142 s56.418 ms711.88 ms815.38ms34.94 ms2.763 s
badgerdb2.833 s39.154 ms1.038 s2.880 s14.114 ms6.829 s
Rocksdb1.501 s59.55 ms39.86 ms1.561 s60 ms3.23 s

磁盘占用:

Boltdb 59M pebbled 80M badgerdb 80M

N=100000

顺序写随机读随机删随机写遍历key总耗时
Boltdb26.459 s527.01 ms1m29.48 s1m29.35 s7.337 ms3m25.84 s
pebbledb7.7904 s691.34 ms6.553 s8.202 s420.94 ms23.705 s
badgerdb27.361 s443.42 ms10.182 s28.262 s98.491 ms1m6.51 s
Rocksdb15.93 s1.63 s396.42 ms16.21 s739.81 ms34.92 s

磁盘占用:

Boltdb 591M pebbled 392M badgerdb 793M Rocksdb 380M

如果sync设置为false的话就可以快很对,但可能会掉数据,应为不是及时写盘,下面给出sync设置为false的情况,但仅供参考,生产环境暂时不考虑这个参数。

N=100000

顺序写随机读随机删随机写遍历key总耗时
Boltdb4.847 s489.82 ms50.370 s48.122 s7.030 ms1m43.85 s
pebbledb1.517 s687.61 ms147.55 ms6.175 s293.21 ms8.84 s
badgerdb1.880 s428.59 ms1.253 s2.151 s100.30 ms6.521 s
Rocksdb1.74 s1.59 s416.88 s1.479 s1.514 s6.805s

总结

BoltDBRocksDBPebbleDBBadgerDB
存储结构B+TREELSM-TREELSM-TREEKey是lms
读速度最快
写速度较慢最快
存储文件数量1个多个多个几个
代码量(包含测试代码)万行0.929272.8
是否还在维护
成熟度(使用的项目)少,但基于PebbleDB的CockroachDB使用还是挺多的
文档是否齐全一般最多最少较多
  • boltdb适合读比重较大的项目
  • badgerdb适合key小但value比较大的项目
  • rocksdb和pebbledb适合对写性能要求比较高的项目,c++程序用rocksdb,golang的话用pebbledb比较合适,当然rocksdb有部分功能pebble没有实现,所以需要先搞清楚项目需求

http://chatgpt.dhexx.cn/article/5mirhVJa.shtml

相关文章

智能优化算法-蜜獾算法Honey Badger Algorithm(附Matlab代码)

引言 提出了一种新的元启发式优化算法——蜜獾算法(Honey Badger Algorithm,HBA)。该算法受蜜獾智能觅食行为的启发,从数学上发展出一种求解优化问题的高效搜索策略。蜜獾挖掘和采蜜的动态搜索行为。于2021年发表在Mathematics and Computers in Simula…

惠普ipaq蓝牙键盘配对码_将旧的Compaq Ipaq从Ubuntu 5.10 Breezy Badger升级到8.10 Intrepid Ibex...

惠普ipaq蓝牙键盘配对码 Ive got an old Compaq Ipaq that I gave my then 10 year old niece to play with. I put Ubuntu 5.10 "Breezy Badger" on it. Fast forward to today, and she wants it refreshed. It hasnt been on the Internet for 3 years so it does…

BadgerDB 原理及分布式数据库的中应用与优化

Part 1 - BadgerDB 设计架构 Badger[1] 是基于论文:WiscKey: Separating Keys from Values inSSD-conscious Storage[2] 的思想利用 Go 语言进行设计实现的。 LSM-Tree 的优势在于将随机写转换为顺序写,将大块的内存连续地写入到磁盘,减少磁…

vue手风琴组件_Vue 2的Badger手风琴组件

vue手风琴组件 Vue-Badger手风琴 (vue-badger-accordion) Badger-Accordion Component for Vue 2.0. Vue 2.0的Badge-Accordion组件。 An accessible light weight, vanilla JavaScript accordion. 轻巧的香草JavaScript手风琴。 View demo 查看演示 Download Source 下载源 …

防追踪创安全网络环境 EFF推Beta版“Privacy Badger”扩展

自棱镜监控丑闻曝光之后在线安全和个人隐私成为网络上热门的话题,为此电子前沿基金会(EFF)今天推出了beta测试版本“Privacy Badger”扩展程序,为Chrome和Firefox浏览器用户打造安全的在线网络环境,阻挡一系列目前网络…

小米手机应用ICON角标Badger显示

项目有个新需求,像iOS一样给应用加个未读消息数量的角标,网上查了下这个开源框架还是不少的,这里介绍一个比较好用的,git地址:https://github.com/leolin310148/ShortcutBadger,集成和实现比较容易&#xf…

Honey Badger BFT共识协议详解

阅读建议 Honey Badger BFT应用了很多前人的研究,进行了巧妙的构造和优化,初次学习往往难以理解。在阅读时可以先大致了解各个构造块的基本作用,再了解总体的共识过程。之后回过头来深入研究各个构造块的原理,特别是BA算法&#…

badger和rocksDB性能对比

结论: 从最后一个表格来看,ssd只对batch_read和batch-write操作有优势,而且在多协程的情况下,这个优势也丢失了。从第二和第三个表格来看,badger的write操作比rocksDB慢了一个数量级,而batch_write操作badg…

Honey Badger BFT(异步共识算法)笔记

最近一直在看Honey Badger BFT共识协议,看了很多博客和一些相关的论文,但是发现有些博客存在着部分理解错误的地方,或者就是直接翻译2016年的那一篇论文,在经过半个多月的细读之后,打算整理出这篇博客,方便…

Badger、Leveldb

BadgerDB v2 介绍 2017年发行 来自DGraph实验室 开源 纯go语言编写 https://github.com/dgraph-io/badger https://godoc.org/github.com/dgraph-io/badger 内存模式 (所有数据存在内存,可能丢失数据)SSD优化键值分离 Key(00000*.sst) Valu…

badger 一个高性能的LSM K/V store

大家好,给大家介绍一下, 新晋的高性能的 K/V数据库: badger。 这是 dgraph.io开发的一款基于 log structured merge (LSM) tree 的 key-value 本地数据库, 使用 Go 开发。 事实上,市面上已经有一些知名的基于LSM tree的k/v数据库…

badger框架学习 (一)

1.badger是什么? badger是一种高性能的 K/V数据库。 这是 dgraph.io开发的一款基于 log structured merge (LSM) tree 的 key-value 本地数据库, 使用 Go 开发。 2.badger有什么优势? 事实上,市面上已经有一些知名的基于LSM tre…

No Free Lunch定理

Stanford大学Wolpert和Macready教授提出了NFL定理,它是优化领域中的一个重要理论研究成果,意义较为深远。现将其结论概括如下: 定理1 假设有A、B两种任意(随机或确定)算法,对于所有问题集,它们…

少样本学习原理快速入门,并翻译《Free Lunch for Few-Shot Learning: Distribution Calibration》

ICLR2021 Oral《Free Lunch for Few-Shot Learning: Distribution Calibration》 利用一个样本估计类别数据分布 9行代码提高少样本学习泛化能力 原论文:https://openreview.net/forum?idJWOiYxMG92s 源码:https://github.com/ShuoYang-1998/ICLR202…

Android lunch分析以及产品分支构建

转自:http://blog.csdn.net/generalizesoft/article/details/7253901 Android lunch分析以及产品分支构建 一、背景 随着Android应用范围越来越广泛,用户对Android的需求也越来越趋于复杂,在开发Android应用以及底层产品驱动时&#xff0…

Free Lunch is Over (免费午餐已经结束)

原文链接:The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software 免费的午餐结束了 软件并行计算的基本转折点 继OO之后软件发展的又一重大变革——并行计算 你的免费午餐即将即将结束。我们能做什么?我们又将做什么&#xff1f…

Free Lunch for Few-Shot Learning: Distribution Calibration(ICLR 2021)

论文笔记 FSL 7】Free Lunch for Few-Shot Learning: Distribution Calibration(ICLR 2021) 下载地址 | 论文源码

2022-11-16 AndroidS 新建产品lunch

一、新建lunch方法 二、实际操作,可以lunch新的菜单。

6-3 There is No Free Lunch (40分)

One day, CYLL found an interesting piece of commercial from newspaper: the Cyber-restaurant was offering a kind of “Lunch Special” which was said that one could “buy one get two for free”. That is, if you buy one of the dishes on their menu, denoted by…

android编译系统分析一:source build/envsetup.sh与lunch

Android编译系统分析系列文章&#xff1a; android编译系统分析一<source build/envsetup.sh与lunch> Android编译系统<二>-mm编译单个模块 android编译系统分析&#xff08;三&#xff09;-make android编译系统&#xff08;四&#xff09;-实战&#xff1a;新增一…