本文共 3872 字,大约阅读时间需要 12 分钟。
NutsDB是纯Go语言编写一个简单、高性能、内嵌型、持久化的key-value数据库。
NutsDB支持ACID事务,所有的操作都在事务中执行,保证了数据的完整性。NutsDB从v0.2.0版本开始支持多种数据结构,如列表(list)、集合(set)、有序集合(sorted set)。
BoltDB
BoltDB和NutsDB很相似都是内嵌型的key-value数据库,同时支持事务。Bolt基于B+tree引擎模型,只有一个文件,NutsDB基于bitcask引擎模型,回生成多个文件。当然他们都支持范围扫描和前缀扫描这两个实用的特性。在写性能上,NutsDB在默认配置下,要比BoltDB好很多。
LevelDB, RocksDB
LevelDB 和 RocksDB 都是基于LSM tree模型.其中LevelDB 不支持事务. RocksDB目前还没看到golang实现的版本。
Badger
Badger也是基于LSM tree模型。但是写性能没有我想象中高,具体看下面的Benchmarks压测报告。
另外,以上数据库均不支持多种数据结构如list、set、sorted set,而NutsDB支持这些数据结构。
被测试的数据库
压测用到的环境以及系统:
压测结果:
BenchmarkBadgerDBPutValue64B-8 10000 135431 ns/op 2375 B/op 74 allocs/opBenchmarkBadgerDBPutValue128B-8 10000 119450 ns/op 2503 B/op 74 allocs/opBenchmarkBadgerDBPutValue256B-8 10000 142451 ns/op 2759 B/op 74 allocs/opBenchmarkBadgerDBPutValue512B-8 10000 109066 ns/op 3270 B/op 74 allocs/opBenchmarkBadgerDBGet-8 1000000 1679 ns/op 416 B/op 9 allocs/opBenchmarkBoltDBPutValue64B-8 5000 200487 ns/op 20005 B/op 59 allocs/opBenchmarkBoltDBPutValue128B-8 5000 230297 ns/op 13703 B/op 64 allocs/opBenchmarkBoltDBPutValue256B-8 5000 207220 ns/op 16708 B/op 64 allocs/opBenchmarkBoltDBPutValue512B-8 5000 262358 ns/op 17768 B/op 64 allocs/opBenchmarkBoltDBGet-8 1000000 1163 ns/op 592 B/op 10 allocs/opBenchmarkBoltDBRangeScans-8 1000000 1226 ns/op 584 B/op 9 allocs/opBenchmarkBoltDBPrefixScans-8 1000000 1275 ns/op 584 B/op 9 allocs/opBenchmarkBuntDBPutValue64B-8 200000 8930 ns/op 927 B/op 14 allocs/opBenchmarkBuntDBPutValue128B-8 200000 8892 ns/op 1015 B/op 15 allocs/opBenchmarkBuntDBPutValue256B-8 200000 11282 ns/op 1274 B/op 16 allocs/opBenchmarkBuntDBPutValue512B-8 200000 12323 ns/op 1794 B/op 16 allocs/opBenchmarkBuntDBGet-8 2000000 675 ns/op 104 B/op 4 allocs/opBenchmarkLevelDBPutValue64B-8 100000 11909 ns/op 476 B/op 7 allocs/opBenchmarkLevelDBPutValue128B-8 200000 10838 ns/op 254 B/op 7 allocs/opBenchmarkLevelDBPutValue256B-8 100000 11510 ns/op 445 B/op 7 allocs/opBenchmarkLevelDBPutValue512B-8 100000 12661 ns/op 799 B/op 8 allocs/opBenchmarkLevelDBGet-8 1000000 1371 ns/op 184 B/op 5 allocs/opBenchmarkNutsDBPutValue64B-8 1000000 2472 ns/op 670 B/op 14 allocs/opBenchmarkNutsDBPutValue128B-8 1000000 2182 ns/op 664 B/op 13 allocs/opBenchmarkNutsDBPutValue256B-8 1000000 2579 ns/op 920 B/op 13 allocs/opBenchmarkNutsDBPutValue512B-8 1000000 3640 ns/op 1432 B/op 13 allocs/opBenchmarkNutsDBGet-8 2000000 781 ns/op 88 B/op 3 allocs/opBenchmarkNutsDBGetByMemoryMap-8 50000 40734 ns/op 888 B/op 17 allocs/opBenchmarkNutsDBPrefixScan-8 1000000 1293 ns/op 656 B/op 9 allocs/opBenchmarkNutsDBRangeScan-8 1000000 2250 ns/op 752 B/op 12 allocs/op
结论:
写性能: NutsDB、BuntDB、LevelDB 最快。其中 NutsDB 最快,比LevelDB快近5-10x, 比BuntDB快近5x,比BadgerDB快近100x,比BoltDB快近200x!
读性能: 都很快. 其中NutsDB(默认配置下) 和 BuntDB 比其他数据库快 近2x。NutsDB使用HintAndMemoryMapIdxMode
读性能下降很多,大概会下降默认配置的近40x。
以上结果仅供参考,其实需要测试维度还有很多。
转载地址:http://tfojn.baihongyu.com/