最近一直在研究技术选型,调查出一些结果。
因为我的应用需要大量随机读,所以用B树。
LSM解决方案有很多,在此一笔带过:
[LSM] https://github.com/cockroachdb/pebble[LSM] https://github.com/dgraph-io/badger[LSM] https://github.com/nutsdb/nutsdb[Vector] https://github.com/milvus-io/milvus
硬盘+缓存
很成熟的解决方案了,可以在硬盘存储大量数据,并按需缓存到内存。
PocketBase:https://github.com/pocketbase/pocketbase
这是一个带图形管理界面的SQLite,Golang版本已经封装好了,基于cznic编写的无CGO版本SQLite。
modernc.org/sqlite:https://pkg.go.dev/modernc.org/sqlite
比较底层的SQLite实现,可以配合Golang官方的sql接口。
硬盘+内存
将数据全部写入内存,并写入硬盘做持久化。
bbolt:https://pkg.go.dev/go.etcd.io/bbolt
优点是读取速度快,缺点是内存占用大。
当内存不够时,会使用交换区,造成性能下降。
buntdb:https://github.com/tidwall/buntdb
对tidwall内存btree的封装,支持创建索引等功能。
硬盘持久化使用写Log实现,文件大且压缩速度慢。
纯硬盘
只在硬盘中创建B树,除了读写外不占用内存。
modernc.org/kv:https://pkg.go.dev/modernc.org/kv
cznic作品,适合没什么读取的纯硬盘数据库。
纯内存
在内存中创建B树,不保存在硬盘,重启后数据消失。
google/btree:https://github.com/google/btree
谷歌官方出品的B树,稳健可靠。
modernc.org/b:https://pkg.go.dev/modernc.org/b
cznic写的内存B+树实现。
tidwall/btree:https://github.com/tidwall/btree
支持多种数据结构,读写速度都很快。