Node.js的进程内持久化键值存储

6
我需要在我正在编写的Node.js应用程序中存储一些元数据。与其自己想出文件格式并管理该文件,我想使用一个进程内持久键值存储。
我看了一下MongoDB,但它似乎必须始终在外部运行(也就是说,你需要先启动Mongo服务器,然后在Node.js中连接它)。我要求这个存储必须完全存在于Node.js进程内 - 或者至少任何外部进程都由库透明地完全管理,并在应用程序关闭连接时将其关闭。
我不太关心性能,但支持异步IO到存储以跟上Node的整个异步事物会很好。
如果存储支持索引那就更好了,因为我肯定会以索引有助于查询数据的方式进行查询。
我相信"sqlite"适合我,但我不认为它像键值存储那样方便。理想情况下,我应该能够使用JSON而不是SQL进行讲话。但如果没有更好的选择,sqlite也可以。
谢谢!

请问您能否解释一下,为什么您要自我限制呢? - Colonel Panic
使用Javascript对象。如果您只有一个进程,则异步性是无意义的。 - Colonel Panic
你真的需要一个数据库来持久化“一些元数据”吗?我认为不需要。 - Gabriel Llamas
1
@MattHickford - 哪个约束条件?我想让它在进程内运行的原因是,我希望最终用户能够安装这个程序并在 cron 作业中运行它,而无需启动一个辅助进程来运行数据库。JavaScript 对象很好,但我将需要运行查询,例如“获取所有属性 X 大于此值的对象”,我强烈怀疑在几十万条目的情况下,这样做会非常慢。 - eblume
1
@GabrielLlamas - 好的,我肯定需要持久化几十万个文件的相关元数据,并且我希望能够比简单地循环数组更快地查询它。 - eblume
6个回答

3

6
谢谢,但不幸的是,这似乎不是正在进行的过程 - 它需要一个外部运行的服务器进程。 - eblume
1
最终,我选择了这个方案。为了让最终用户感觉像是一个单一的过程,我使用 child_process.spawn 在 Node 中启动一个本地 Redis 服务器,并确保在退出之前将其关闭。谢谢您的建议! - eblume
这是一个相当新颖的方法。很高兴你让它工作了。希望将redis安装打包为应用程序的一部分不会太麻烦。 - 250R
非常想知道您如何从Node.js生成服务器。有链接吗?谢谢。 - wayofthefuture

3

3

谢谢,好的提示。在需要将数据库捆绑到您的节点库中,并希望支持更好扩展解决方案的情况下非常有用。 - Laurens Rietveld

1
我想你可能会对final-db感兴趣。
FinalDB使用文件系统来存储数据。它不是键值存储,而是基于文档的nosql解决方案。它支持索引(映射)- 您可以在每个集合上指定映射函数,当然它是一个进程内解决方案。

1

-1

怎么样...

var store = { };

//store 'myKey'
store.myKey = { foo: 'bar' };

//fetch 'myKey'
var x = store.myKey;

此外,如果您使用几乎与您的问题标题完全相同的关键字进行谷歌搜索,您会发现http://pgte.github.com/alfred/
我认为目前可用的稳定版本并不是很多。但外部提供的一些选项还是相当不错的(例如Redis)。

谢谢您的建议!Alfred是一个真正的可能性,但您说得对,它似乎不是非常稳定 - 但绝对值得一试。像您提出的简单对象存储可能会起作用,但我怀疑当我运行“获取所有属性X大于某个值的对象”的“查询”时,它会崩溃,因为我将有几十万条目。 - eblume
@eblume 是的,这是完全可能的。您需要为其设计一些索引方案。如果可能的话,我真的会选择Mongo或Redis,它们都非常容易设置。 - Jani Hartikainen
我同意与现有的redis实例进行接口交互或启动一个永久本地redis实例似乎很简单...但我想知道从node应用程序内部启动redis实例,使用一段时间后再关闭它会有多难/合理?我想可以使用child_process模块来实现。 - eblume

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接