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)
次数 | 耗时 | 内存 | IO |
---|---|---|---|
100000 | 3s | 高(比Disk高三倍) |
BadgerDB 性能测试(Diskless Mode)
次数 | 耗时 | 内存 | IO | 磁盘空间 |
---|---|---|---|---|
100000 | 5s | 高(持续增长,一定时间内会释放一部分) | 4.8M/s | 1600W/5G |
LevelDB 性能测试
次数 | 耗时 | 内存 | IO | 磁盘空间 |
---|---|---|---|---|
100000 | 1.4s | 低(可以手动设置memtable) | 56.8M/s | 1600W/1.65G |
测试用例
leveldb测试用例
func main(){
var err error
db,err = leveldb.OpenFile("D:\\db\\leveldb", nil)
if err != nil {
panic(err)
}
defer db.Close()
i :=
staTime := time.Now()
for {
Add(utils.RandStringBytesMaskImprSrcUnsafe(32), utils.RandStringBytesMaskImprSrcUnsafe(64));
i++
if i % 100000 == {
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 error
db, 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 :=
staTime := time.Now()
for {
Set(utils.RandStringBytesMaskImprSrcUnsafe(32),utils.RandStringBytesMaskImprSrcUnsafe(64))
i++
if i % 100000 == {
//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 index
letterIdxMask = 1<<letterIdxBits - 1 // All 1-bits, as many as letterIdxBits
letterIdxMax = 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 >= ; {
if remain == {
cache, remain = src.Int63(), letterIdxMax
}
if idx := int(cache & letterIdxMask); idx < len(letterBytes) {
b[i] = letterBytes[idx]
i--
}
cache >>= letterIdxBits
remain--
}
return b
}
Benchmark test
leveldb testcase
func BenchmarkAdd(b *testing.B) {
defer db.Close()
//重置时间
b.ResetTimer()
//所有基准测试函数
b.ReportAllocs()
for i:=; 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:=; i <= b.N; i++{
Get(fmt.Sprintf("%s%v", "CEhxvNeqSJBvjIUObHQSTUhkFGGrcnaj", utils.RandInt()))
}
}
badger testcase
func BenchmarkSet(b *testing.B) {
//重置时间
b.ResetTimer()
//所有基准测试函数
b.ReportAllocs()
for i:=; 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:=; i <= b.N; i++{
Get(fmt.Sprintf("%s%v", "CEhxvNeqSJBvjIUObHQSTUhkFGGrcnaj", utils.RandInt()))
}
}
关于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
————————————————
原文链接:https://blog.csdn.net/duyayun/article/details/105235454