Badger、Leveldb

article/2025/10/13 3:30:24

BadgerDB v2 介绍

2017年发行 来自DGraph实验室 开源 纯go语言编写
https://github.com/dgraph-io/badger
https://godoc.org/github.com/dgraph-io/badger

  • 内存模式 (所有数据存在内存,可能丢失数据)
  • SSD优化
  • 键值分离 Key(00000*.sst) Value 分开存储(00000*.vlog)
    • SSTable存储结构kv是存在一起的, badger中v存的是指针,真正的value存在.vlog中
    • github.com\dgraph-io\badger\v2@v2.0.3\structs.go在这里插入图片描述
  • Stream 模式
  • Merge Operations (数据合并)
  • GC (垃圾回收)
  • Database backup (数据备份)
  • 静态加密(v2.0)
  • 数据压缩(v2.0)通过使用提供的两种(zstd(需要cgo)、snappy)压缩算法之一压缩每个数据块,可以节省存储空间。仅压缩SST文件,而不压缩vlog中的文件。

badger 目录结构
在这里插入图片描述

LevelDB 介绍

2011年发行 来自Google实验室 开源 发行于C++,GO复写
https://github.com/google/leveldb (C++版本)
https://github.com/syndtr/goleveldb(GO版本)
https://godoc.org/github.com/syndtr/goleveldb/leveldb
目录结构
在这里插入图片描述

BadgerDB 性能测试(In-Memory Mode)

opts := badger.DefaultOptions("").WithInMemory(true)
次数耗时内存IO
1000003s高(比Disk高三倍)

在这里插入图片描述
在这里插入图片描述
备注:

  • 每写入十万条记录打印一次log;
  • 无论数据多少不影响后期写入;
  • 540W条记录时占内存2.4G

BadgerDB 性能测试(Diskless Mode)

次数耗时内存IO磁盘空间
1000005s高(持续增长,一定时间内会释放一部分)4.8M/s1600W/5G

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

LevelDB 性能测试

次数耗时内存IO磁盘空间
1000001.4s低(可以手动设置memtable)56.8M/s1600W/1.65G

在这里插入图片描述
1600W记录在这里插入图片描述

测试用例

leveldb测试用例

func main(){var err errordb,err = leveldb.OpenFile("D:\\db\\leveldb", nil)if err != nil {panic(err)}defer db.Close()i := 0staTime := time.Now()for {Add(utils.RandStringBytesMaskImprSrcUnsafe(32), utils.RandStringBytesMaskImprSrcUnsafe(64));i++if i % 100000 == 0 {fmt.Printf("number:%v,time:%v\n",i,time.Since(staTime))staTime = time.Now()}}
}func Add(key []byte ,value []byte){db.Put(key, value, nil)
}

badger 测试用例

func main() {var err errordb, err = badger.Open(badger.DefaultOptions("D:\\db\\badger"))//内存模式//db, err = badger.Open(badger.DefaultOptions("").WithInMemory(true))if err != nil {log.Fatal(err)}defer db.Close()i := 0staTime := time.Now()for {Set(utils.RandStringBytesMaskImprSrcUnsafe(32),utils.RandStringBytesMaskImprSrcUnsafe(64))i++if i % 100000 == 0 {//var m runtime.MemStats//runtime.ReadMemStats(&m)//fmt.Printf("%d Kb\n",m.Alloc/1024)fmt.Printf("number:%v,ageTime:%v\n",i,time.Since(staTime))staTime = time.Now()}}
}func Set(key []byte,value []byte) {db.Update(func(txn *badger.Txn) error {return txn.Set(key, value)})
}

生成随机数

const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
const (letterIdxBits = 6                    // 6 bits to represent a letter indexletterIdxMask = 1<<letterIdxBits - 1 // All 1-bits, as many as letterIdxBitsletterIdxMax  = 63 / letterIdxBits   // # of letter indices fitting in 63 bits
)var src = rand.NewSource(time.Now().UnixNano())
//生成随机数
func RandStringBytesMaskImprSrcUnsafe(n int) []byte {b := make([]byte, n)// A src.Int63() generates 63 random bits, enough for letterIdxMax characters!for i, cache, remain := n-1, src.Int63(), letterIdxMax; i >= 0; {if remain == 0 {cache, remain = src.Int63(), letterIdxMax}if idx := int(cache & letterIdxMask); idx < len(letterBytes) {b[i] = letterBytes[idx]i--}cache >>= letterIdxBitsremain--}return b
}

Benchmark test

leveldb testcase

func BenchmarkAdd(b *testing.B) {defer db.Close()//重置时间b.ResetTimer()//所有基准测试函数b.ReportAllocs()for i:=0; i <= b.N; i++{Add(utils.RandStringBytesMaskImprSrcUnsafe(32), utils.RandStringBytesMaskImprSrcUnsafe(64));}
}//预先随机生成100个CEhxvNeqSJBvjIUObHQSTUhkFGGrcnaj+n的key
func BenchmarkGet(b *testing.B) {defer db.Close()//重置时间b.ResetTimer()//所有基准测试函数b.ReportAllocs()for i:=0; i <= b.N; i++{Get(fmt.Sprintf("%s%v", "CEhxvNeqSJBvjIUObHQSTUhkFGGrcnaj", utils.RandInt()))}
}

goos: windows
goarch: amd64
pkg: github.com/hyperledger/db_case/leveldb
BenchmarkAdd
BenchmarkAdd-8 1948048 610 ns/op 96 B/op 2 allocs/op
PASS

goos: windows
goarch: amd64
pkg: github.com/hyperledger/db_case/leveldb
BenchmarkGet
BenchmarkGet-8 80000 14400 ns/op 912 B/op 14 allocs/op
PASS

badger testcase

func BenchmarkSet(b *testing.B) {//重置时间b.ResetTimer()//所有基准测试函数b.ReportAllocs()for i:=0; i <= b.N; i++{Set(utils.RandStringBytesMaskImprSrcUnsafe(32),utils.RandStringBytesMaskImprSrcUnsafe(64))}
}
//预先随机生成100个CEhxvNeqSJBvjIUObHQSTUhkFGGrcnaj+n的key
func BenchmarkGet(b *testing.B) {defer db.Close()//重置时间b.ResetTimer()//所有基准测试函数b.ReportAllocs()for i:=0; i <= b.N; i++{Get(fmt.Sprintf("%s%v", "CEhxvNeqSJBvjIUObHQSTUhkFGGrcnaj", utils.RandInt()))}
}

goos: windows
goarch: amd64
pkg: github.com/hyperledger/db_case/badger
BenchmarkSet
BenchmarkSet-8 23300 48224 ns/op 2372 B/op 72 allocs/op
PASS

badger 2020/04/01 23:22:43 INFO: All 0 tables opened in 0s
badger 2020/04/01 23:22:43 INFO: Replaying file id: 0 at offset: 0
badger 2020/04/01 23:22:43 INFO: Replay took: 138.006ms
badger 2020/04/01 23:22:43 DEBUG: Value log discard stats empty
goos: windows
goarch: amd64
pkg: github.com/hyperledger/db_case/badger
BenchmarkGet
BenchmarkGet-8 85722 15025 ns/op 455 B/op 8 allocs/op
PASS

100w 写入测试
badger

BenchmarkSet-8 1000000 52995 ns/op 2621 B/op 72 allocs/op

leveldb

BenchmarkAdd-8 1000000 13236 ns/op 258 B/op 5 allocs/op

关于win系统出现 Value log truncate required to run DB. This might result in data loss 。

https://github.com/dgraph-io/badger/pull/1134
https://github.com/dgraph-io/badger/issues/1126


http://chatgpt.dhexx.cn/article/tYGbEaiS.shtml

相关文章

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

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

badger框架学习 (一)

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

No Free Lunch定理

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

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

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

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

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

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

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

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

论文笔记 FSL 7】Free Lunch for Few-Shot Learning: Distribution Calibration&#xff08;ICLR 2021&#xff09; 下载地址 | 论文源码

2022-11-16 AndroidS 新建产品lunch

一、新建lunch方法 二、实际操作&#xff0c;可以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;新增一…

Lesson 2 Breakfast or lunch? 早餐还是午餐?

1.原文 2. 参考译文 3. New words and expressions ★until prep.直到 until用于表示动作、状态等的持续&#xff0c;可译为“一直到……为止”或“在……以前”。在肯定句中&#xff0c;它与表示持续性状态的动词连用&#xff0c;表示持续到某一时刻&#xff1a; I’ll wait…

Android 10 添加 lunch

需求&#xff08;当然这只是其中一个&#xff09;&#xff1a;多个产品用同一个核心板&#xff0c;外设驱动不一样&#xff0c;设备树不一样&#xff0c;开机画面等不一样&#xff0c;如果不添加&#xff0c;就会每次要生成哪个板子就覆盖对应的文件&#xff0c;麻烦不说还容易…

没有免费午餐定理No Free Lunch Theorem

不得不说&#xff0c;网上博客千千万&#xff0c;在技术方面&#xff0c;我承认这些博客的重要性。然而&#xff0c;只要和机器学习理论挂钩&#xff0c;似乎都讲得不清不楚&#xff0c;大家都是各自地抄&#xff0c;抄书籍&#xff0c;抄论文&#xff0c;抄别人的博客或者直接…

没有免费午餐定理(No Free Lunch Theorem)

当我们拿到数据之后&#xff0c;构建机器学习算法的第一步应当是&#xff1a;观察数据&#xff0c;总结规律。 目前由于大数据和深度学习的发展&#xff0c;很多人会认为&#xff0c;只要收集足够多的数据&#xff0c;从网上的开源算法模型中随便找一个&#xff0c;直接将数据丢…

[TIST 2022] No Free Lunch Theorem for Security and Utility in Federated Learning

联邦学习中的安全性和实用性没有免费午餐定理 No Free Lunch Theorem for Security and Utility in Federated Learning 目录 摘要简介2 相关文献2.1 隐私测量2.2 联邦学习2.2.1 FL 中的威胁模型。2.2.2 FL 中的保护机制。 2.3 隐私-实用权衡 3 一般设置和框架3.1 符号3.2 一般…

Andriod中如何新建lunch项

Andriod编译过程一般为&#xff1a; 1.source build/envsetup.sh //加载命令&#xff0c;在项目根目录下&#xff08;~/purple/code/a/A_code20211126/sdm660&#xff09;目录 备注&#xff1a;在envsetup.sh里将执行vendor和device目录及各自子目录下所有的vendorsetup.sh&a…

VS中创建自定义控件

第一步&#xff1a;创建一个ASP.NET WEB应用程序 第二步&#xff1a;在同一个解决方案中创建一个服务控件项目 2.1 再次创建一个asp.net web应用程序。如图&#xff1a; 2.2 然后在这个项目下创建一个Web窗体服务器控件 第三步&#xff1a;编辑为我想要的控件 在这个我这个…

C#自定义控件的设计与调用

在C#下建立自己的控件库&#xff0c;需用到自定义控件的设计与调用。 一、自定义控件的设计 自定义控件&#xff0c;步骤如下&#xff1a; 1.点击文件&#xff0d;&#xff1e;新建项目&#xff0d;&#xff1e;选择Windows控件库2.编辑控件3.点击生成&#xff0d;&#xff1…

树形控件

一&#xff0e;分析过程 1.今天就来说说树形控件&#xff0c;什么是树形控件呢&#xff1f;树形控件在Windows系统中是很常见的&#xff0c;例如资源管理器左侧的窗口中就有用来显示目录的树形视图。 树形视图中以分层结构显示数据&#xff0c;每层的缩进不同&#xff0c;层次越…

WPF基本控件简介

默认可见的基本控件有 1、Border 设置控件画边框&#xff0c;2、Button 按钮 3、Calendar 日历 4、Canvas 画布控件 5、Checkbox 复选框 6、Combobox 下拉列表框 7、ContentControl 内容控件 8、DataGrid 显示表格数据 9、DataPicker 日期选择控件&#xff0c;带日历 10、Dock…