使用Redis + Node.js的数据库架构

5

在参考了一些其他的SO问题后,我正在开发一个网站监控应用程序作为我的个人项目,旨在了解更多关于Node.js和Redis方面的知识。

我的计划是让用户添加URL,并将它们添加到Redis SET中。每分钟,我获取SET结果,执行HTTP Get请求并打印响应。

这似乎很好,但是我有几个问题:

  1. 由于Redis SET不允许重复的键(这将使我不必对同一URL进行请求),当用户从其帐户中删除URL但另一个用户具有相同的URL时,我如何控制?我可以在URL键中设置INCR值,以便我知道有多少用户在其帐户中拥有该URL吗?

  2. 由于我每分钟执行一次HTTP请求,并且我希望使用Redis保存结果(响应时间,上/下等),最佳的方式是什么来保存Redis中所有数据(每分钟对每个URL的请求结果)?我应该将每个响应保存在唯一的Redis密钥中吗?

  3. 为了实时向用户展示结果,查询结果并实时解析的最佳方法是什么?

谢谢您的帮助。

1个回答

6
我认为你应该在redis-cli中开始编写原型。此外,我想指出这篇非常好的文章来自Simon Willison 解释 redis
鉴于 Redis SET 不允许重复的键(这将使我免于对同一 URL 进行请求),那么当用户从他的帐户中删除 URL 但另一个用户具有相同的 URL 时,我如何控制呢?我可以在 URL 键中使用 INCR 值,以便知道有多少用户在其帐户中拥有该 URL。我会使用SADD+INCR
SADD urls http://www.google.com
INCR http://www.google.com

要删除 http://www.google.com,我只需执行以下操作:

DECR http://www.google.com
#Only if DECR http://www.google.com => 0, then you should remove from SET
SREM urls http://www.google.com 

考虑到我每分钟都要进行一次HTTP请求,并且希望使用Redis来保存结果(响应时间,开关等),那么最好的方法是什么?如何在Redis中保存所有这些数据(每分钟对每个URL的请求结果)?
我会为每个URL使用一个唯一的键,并使用JSON(JSON.stringify(obj))将数据写回redis,使用MSET命令。
MSET data:http://www.google.com "{json for google}" data:http://www.yahoo.com "{json for yahoo}"

为了实时向用户展示结果,查询结果并实时解析的最佳方式是什么?
我建议使用MGET获取结果,并解析json(obj = JSON.parse(json-string))。

好的!这很有道理!谢谢!只有一个问题,你需要将新结果附加到JSON中。这是最好的解决方案吗?一旦JSON文件变得非常大,就不会出现扩展问题吗?你能详细说明一下吗?我使用JS / JSON的经验很少。谢谢Alfred!;) - donald
如果您需要为每个URL保留历史数据而不仅仅是当前数据,请使用列表而不是简单的键。您会失去MSET,但在编写时无需担心先前的数据,并且可以轻松修剪列表。我还会考虑保留URL列表,而不是集合 - 使用设置为队列的列表,您可以轻松地分散请求,而不必一次运行所有请求。 - Tom Clarkson
@Donald,我最近几天在度假,但我没有添加任何内容。你应该再看一下MSET的文档。但是你也有一点对,如果MSET字符串太长,它可能会变慢。也许我只会使用很多SETS,这也非常快(大约每秒110000个SETS)。 - Alfred

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