【框架: Nodejs单机数据库选择】
2024-04-24 本文已影响0人
wn777
场景
应用程序为nodejs程序,为nodejs程序选择一款适合的单机数据库,提供数据管理功能。
关键词,单机运行,适合nodejs服务。
所需基础功能
- CURD,增删改查
- 索引,加速查找
- 事务相关(增值) 如果没有,可以自己实现,考虑通过加锁实现
- Geo(增值)如果没有,可以自己实现,需要考虑下性能
要求
单机相对于云上,资源有限,考虑性能。资源消耗(mem,cpu)不要占用过高 ,查询性能要好 ,要适用于单机设备,小型轻量级的。
如何在单机上做数据管理
单机数据管理框架,总结下来有2种方案,
1, 框架直接把数据读到内存中,然后操作修改,再和磁盘数据同步。
内存型简单直接,功能性,性能上一般。
2,数据层加配一个数据库。框架本质上是个数据层layer,可以搭配不同的数据库使用。
数据层+数据库功能更丰富,性能更优。
筛选出的单机数据管理框架:lowdb, nedb, rxdb,pouchdb。lowdb,nedb属于上述图1,rxdb,pouchdb属于上述图2,具体对比如下,
方案对比
整体
lowdb | nedb | rxdb | pounchdb | |
---|---|---|---|---|
运行环境 | node | node | node | node / broswer |
语法 | 纯json操作,手动落盘 | 类似MongoDB 的SQL语句 | 类似MongoDB的SQL语句 | MongoDB 的SQL语句 |
组织结构 | 无 | 没有table,只分datastore | - | 没有table,只分database |
github star | 20.6k | 13.4k | 20.2k | 16.2k |
易用性 | 弱 | 高 | 可以 | 高 |
问题 | 过于简单 ,性能优化不足 ,数据量大时,可能有性能问题 | 停止维护,内存中数据与磁盘中大小相同 | 部分功能收费 | 暂无发现明显问题 |
lowdb性能问题: If you have large JavaScript objects (~10-100MB) you may hit some performance issues. This is because whenever you call db.write, the whole db.data is serialized using JSON.stringify and written to storage.
nedb的合并过程: A copy of the whole database is kept in memory. This is not much on the expected kind of datasets (20MB for 10,000 2KB documents).
功能与使用
lowdb | nedb | rxdb | pounchdb | |
---|---|---|---|---|
语法 | 纯json操作,手动落盘 | 语法上类似MongoDB 的SQL语句 | 语法上类似MongoDB 的SQL语句 | mango语法,与MongoDB 的SQL语句差不多 |
存储结构 | 运行时memory存储,启动时整体读盘,wirte时整体落盘 | append+compress模式,类似redis AOF | 取决于选择数据库,由于rxdb上面除内存型存储,非完全开源,大部分数据库存储需要付费使用,未继续调研 | levelDB,kv存储,数据库也是可以选择多种,以下是假设选择leveldb,进行的调研 |
explain | 不支持 | 不支持 | - | 支持 |
changestream | 不支持 | 不支持 | - | 支持 |
await | 支持 | 需要额外代码 | - | 支持 |
索引 | 无 | 支持 | - | 支持 |
资源配置要求 | 要求低 | 要求低,随数据增长 | - | 可配置,大小都可以,内存越大性能越好 |
数据层,storage,数据 之间的关系
数据层-storage-数据总结
4种方案
方案 | lowdb | nedb | rxdb + sqlite | pouchdb + leveldb |
---|---|---|---|---|
定位 | 内存型数据库 | 内存型数据库 | sql型数据库 | no-sql数据库 |
特点 | 过于简单,数据全部在内存中,查快,但是随着数据增多,内存会同步1:1增长 | 相对成熟。数据全部在内存中,和lowdb有相同问题。 | 相对成熟,但是sqlite版不是开源的,收费。 | 多级缓存,少量数据在内存中,大部分在磁盘中。pouchdb作为数据层提供较为丰富的功能,leveldb对于查询性能有保障。 |
功能 | 缺乏 | 一般 | 丰富 | 丰富 |
性能 | 较差 | 一般 | 良 | 优 |
存储结构 | JSON | JSON | B树 | LSM-Tree |
综合来看, pouchdb + leveldb 效果出众,语法成熟,功能较为完善,配置要求不高,读写性能优。