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

Posted

技术标签:

【中文标题】node.js 的进程内持久键值存储【英文标题】:In-process persistant key-value store for node.js 【发布时间】:2012-05-02 08:41:34 【问题描述】:

我需要在我正在编写的 node.js 应用程序中存储一些元数据。我不想提出自己的文件格式并管理该文件,而是想使用进程内持久键值存储。

我正在查看 mongodb,但似乎 mongodb 必须始终在进程外运行(也就是说,您需要先启动一个 mongo 服务器,然后在 node.js 中连接到它。)我需要任何存储也就是说,它完全存在于 node.js 进程中——或者至少任何外部进程都完全由库透明地管理,并在应用程序关闭连接时终止它们。

我不太关心性能,但支持异步 IO 到存储以跟上 Node 的整个异步操作会很好。

如果商店支持索引也很好,因为我肯定会以索引有用的方式查询数据。

我很确定“sqlite”对我有用,但我并不认为它与键值存储一样方便。理想情况下,我应该能够用 JSON 说话,而不是 SQL。但是如果没有更好的存在,sqlite 会起作用。

谢谢!

【问题讨论】:

请你解释一下为什么你会受到这个限制吗? 使用 javascript 对象。如果你只有一个进程,那么异步是没有意义的。 你真的需要一个数据库来保存“一些元数据”吗?我不这么认为。 @MattHickford - 哪个约束?我希望它在进程中的原因是因为我希望最终用户能够安装这个程序并在一个 cron 作业中运行它,而不必启动一个辅助进程来运行数据库。 Javascript 对象很好,只是我需要运行诸如“获取属性 X 大于此值的所有对象”之类的查询,并且我强烈怀疑有几十万个条目会运行得很慢。 @GabrielLlamas - 我肯定需要保留几十万个文件的相关元数据,我希望能够比简单地循环数组更快地查询它。 【参考方案1】:

试试 nStore。https://github.com/creationix/nstore

它正在处理键值存储。使用也很简单。

【讨论】:

【参考方案2】:

看看https://github.com/sergeyksv/tingodb。它与 MongoDB API 紧密兼容,因此您可以在需要时升级到 MongoDB。

【讨论】:

谢谢,好建议。在您希望在节点库中捆绑数据库但又希望支持更好的可扩展解决方案的情况下很有用【参考方案3】:

你可能有兴趣使用 redis http://redis.io/

节点https://github.com/mranney/node_redis有一个流行的帮助库

那么你可以这样做:

var redis = require("redis");
var client = redis.createClient();

client.set("foo_rand000000000000", "OK");

【讨论】:

谢谢,但不幸的是,这似乎不是在进程中 - 它需要一个外部运行的服务器进程。 最后,我选择了这个。为了让最终用户看起来像是一个单一的进程,我使用child_process.spawn 在节点内的非特权端口上启动了一个本地 redis 服务器,并确保在退出之前将其拆除。谢谢你的建议! 这是一种相当新颖的方法。真高兴你做到了。希望将 redis 安装打包为您的应用程序的一部分不会太麻烦。 很想知道您是如何从 Node.js 生成服务器的。有链接吗?谢谢。【参考方案4】:

我想你可能对final-db 感兴趣。

FinalDB 使用文件系统来存储它的数据。它不是键值存储,而是 基于文档的 nosql 解决方案。它支持索引(地图) - 您可以在每个集合上指定 地图功能,当然这是一个正在进行中的解决方案。

【讨论】:

【参考方案5】:

看看levelup。这是leveldb 的包装。 levelup 包装器通过 npm 安装 leveldb 并完全在您的节点进程中运行。

有许多建立在 leveldb 之上的数据库。查看https://github.com/rvagg/node-levelup/wiki/Modules 获取列表。

为方便起见,您可以使用 level 包,它将 levelup 和 leveldown 捆绑在一起

【讨论】:

【参考方案6】:

怎么样...

var store =  ;

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

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

另外,用谷歌搜索几乎完全是你的问题标题,你会发现http://pgte.github.com/alfred/

我真的不认为有很多特别稳定的可用。不过,外部产品非常好(例如 Redis)

【讨论】:

感谢您的建议!阿尔弗雷德是一个真正的可能性,但你是对的,它并没有让我觉得非常稳定——但绝对值得一试。像您建议的简单对象存储可能会起作用,但我怀疑当我运行“查询”时它会窒息,例如“获取所有属性 X 大于该值的对象”,因为我将有几十万个条目。跨度> @eblume 是的,这很有可能......你需要为它想出一些索引方案。如果可能的话,我真的会选择 mongo 或 redis,两者的设置都很简单。 我同意与现有 redis 实例交互或启动永久本地 redis 实例似乎很简单......但我想知道从内部启动一个 redis 实例有多困难/合理一个节点应用程序,使用它一点,然后在完成后将其关闭?我想使用可以工作的child_process 模块。

以上是关于node.js 的进程内持久键值存储的主要内容,如果未能解决你的问题,请参考以下文章

forever让node.js持久运行

等待事件在 Node.js 进程内触发

使用forever让node.js持久运行

Web 进程在启动 node.js 后 60 秒内无法绑定到 $PORT

node.js 中存储的模块变量在啥范围内?

Web进程无法在启动node.js后的60秒内绑定到$ PORT