NutsDB是纯Go语言编写一个简单、高性能、内嵌型、持久化的key-value数据库。
NutsDB支持ACID事务,所有的操作都在事务中执行,保证了数据的完整性。NutsDB从v0.2.0版本开始支持多种数据结构,如列表(list)、集合(set)、有序集合(sorted set)。
项目特性
- 高性能
- 内嵌型
- 支持 ACID 事务
- 支持基本的 Put、Delete、Get 操作
- 支持前缀扫描
- 支持范围扫描
- 除了基本的 String,还支持多种数据结构如列表(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支持这些数据结构。
Benchmarks
被测试的数据库
压测用到的环境以及系统:
- Go Version : go1.11.4 darwin/amd64
- OS: Mac OS X 10.13.6
- Architecture: x86_64
- 16 GB 2133 MHz LPDDR3
- CPU: 3.1 GHz Intel Core i7
压测结果:
BenchmarkBadgerDBPutValue64B-8 10000 135431 ns/op 2375 B/op 74 allocs/op
BenchmarkBadgerDBPutValue128B-8 10000 119450 ns/op 2503 B/op 74 allocs/op
BenchmarkBadgerDBPutValue256B-8 10000 142451 ns/op 2759 B/op 74 allocs/op
BenchmarkBadgerDBPutValue512B-8 10000 109066 ns/op 3270 B/op 74 allocs/op
BenchmarkBadgerDBGet-8 1000000 1679 ns/op 416 B/op 9 allocs/op
BenchmarkBoltDBPutValue64B-8 5000 200487 ns/op 20005 B/op 59 allocs/op
BenchmarkBoltDBPutValue128B-8 5000 230297 ns/op 13703 B/op 64 allocs/op
BenchmarkBoltDBPutValue256B-8 5000 207220 ns/op 16708 B/op 64 allocs/op
BenchmarkBoltDBPutValue512B-8 5000 262358 ns/op 17768 B/op 64 allocs/op
BenchmarkBoltDBGet-8 1000000 1163 ns/op 592 B/op 10 allocs/op
BenchmarkBoltDBRangeScans-8 1000000 1226 ns/op 584 B/op 9 allocs/op
BenchmarkBoltDBPrefixScans-8 1000000 1275 ns/op 584 B/op 9 allocs/op
BenchmarkBuntDBPutValue64B-8 200000 8930 ns/op 927 B/op 14 allocs/op
BenchmarkBuntDBPutValue128B-8 200000 8892 ns/op 1015 B/op 15 allocs/op
BenchmarkBuntDBPutValue256B-8 200000 11282 ns/op 1274 B/op 16 allocs/op
BenchmarkBuntDBPutValue512B-8 200000 12323 ns/op 1794 B/op 16 allocs/op
BenchmarkBuntDBGet-8 2000000 675 ns/op 104 B/op 4 allocs/op
BenchmarkLevelDBPutValue64B-8 100000 11909 ns/op 476 B/op 7 allocs/op
BenchmarkLevelDBPutValue128B-8 200000 10838 ns/op 254 B/op 7 allocs/op
BenchmarkLevelDBPutValue256B-8 100000 11510 ns/op 445 B/op 7 allocs/op
BenchmarkLevelDBPutValue512B-8 100000 12661 ns/op 799 B/op 8 allocs/op
BenchmarkLevelDBGet-8 1000000 1371 ns/op 184 B/op 5 allocs/op
BenchmarkNutsDBPutValue64B-8 1000000 2472 ns/op 670 B/op 14 allocs/op
BenchmarkNutsDBPutValue128B-8 1000000 2182 ns/op 664 B/op 13 allocs/op
BenchmarkNutsDBPutValue256B-8 1000000 2579 ns/op 920 B/op 13 allocs/op
BenchmarkNutsDBPutValue512B-8 1000000 3640 ns/op 1432 B/op 13 allocs/op
BenchmarkNutsDBGet-8 2000000 781 ns/op 88 B/op 3 allocs/op
BenchmarkNutsDBGetByMemoryMap-8 50000 40734 ns/op 888 B/op 17 allocs/op
BenchmarkNutsDBPrefixScan-8 1000000 1293 ns/op 656 B/op 9 allocs/op
BenchmarkNutsDBRangeScan-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。
以上结果仅供参考,其实需要测试维度还有很多。
评论