【问题标题】:node.js creating jobs with ttl using redisnode.js 使用 redis 使用 ttl 创建作业
【发布时间】:2019-03-21 08:54:45
【问题描述】:

我需要在这个场景中设计一个 node.js 应用:

  1. 用户使用具有唯一token cookie 的 /page 请求
  2. Node.js 在 redis(?) 上使用此令牌创建一个 record,TTL 为 5 分钟。 tokens 有 n 类型。所以 redis(?) 应该存储带有类型的令牌。
  3. 如果用户在record 过期之前再次返回,record 的 TTL 将再次重置为 5 分钟。
  4. 如果用户没有再次返回并且record 过期,则触发函数。
  5. 最后,我需要 records 的计数属于特定类型(即类型 27)。

解决此问题的最佳方法是什么? redis 是正确的选择吗?如果我使用redis,如何计算tokens 并触发5. step? 使用https://github.com/Automattic/kue 或类似的东西会是不错的选择吗?

编辑: 似乎可能与Event on key expire 重复 .总的来说,请问,redis适合这个问题吗?如果您认为是,请您举一个我应该遵循的示例模式。如果没有,即使没有 redis 或 3rd 方工具,还有什么其他解决方案。

正如我在上面列表中的 5. 项中所说,redis 似乎不适合使用如下所述的模式查询keyshttps://redis.io/commands/keys .因为似乎没有办法对集合 (TTL for a set member) 的单个成员设置过期时间,所以我不能将令牌放入 type 集合或散列中。因此,我需要查询键以获取组的计数 (type),这似乎不像上面链接中描述的那样有效。

即使https://redis.io/topics/notifications 解决了上面列表中第 4 项的问题,我也会询问“我应该使用哪种模式/算法以及如何使用”。我不想让你为我编码,但只需要一个火花。教程、指南、视频等会很棒。谢谢!

【问题讨论】:

标签: node.js redis jobs job-scheduling


【解决方案1】:

为了实现你想要的,你有很多选择,但我将在这里提供一个,它在检索速度方面非常有效,但它需要更多空间。显然,这完全取决于您的用例。

说token是12345,类型是A

添加令牌时(我们将通过交易来完成):

MULTI
SETEX tokens:12345 300 ""
SET type:12345 "A"
INCR types:A
EXEC

当密钥过期时(300 秒后,或者 Redis 认为它​​过期时),我们会使用 Keyspace 通知 (https://redis.io/topics/notifications) 来监听 EXPIRED 事件:

PSUBSCRIBE __keyspace@0__:expired

当该订阅收到消息时,您需要在您的代码中:

MULTI
GET type:12345 # Returns A
DEL type:12345
DECR types:A
EXEC

为了获取特定类型的元素:

GET types:A

任何 NodeJS Redis 客户端都可以正常工作。

我想明确指出,这只是您拥有的多种选择之一; Redis 的优势之一是它的灵活性。

【讨论】:

  • 就是这样!感谢您的指导。如果我在任何时候卡住,我会试一试并写在这里。
  • 没问题,如果您需要任何帮助,请告诉我
  • 我认为__keyspace@0__:expired应该改成__keyevent@0__:expired
  • 可能是,对不起
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
相关资源
最近更新 更多