node.js使用Redis使用ttl创建作业

时间:2018-10-16 18:37:42

标签: node.js redis jobs job-scheduling

在这种情况下,我需要设计一个node.js应用程序:

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

您可以通过多种选择来实现自己想要的目标,但是我将在此处提供一种选择,就检索速度而言这是一种非常有效的选择,但是需要更多空间。显然,这完全取决于您的用例。

说令牌是12345,类型是A

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

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

当密钥过期时(300秒后,或者每当Redis认为它已过期),我们将使用侦听EXPIRED事件的密钥空间通知(https://redis.io/topics/notifications)来获得通知:

PSUBSCRIBE __keyspace@0__:expired

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

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

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

GET types:A

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

我想表明这只是您拥有的多个选项之一; Redis的优势之一是它的灵活性。