Redis处理队列管理机制

Redis dealing with queuing management mechanism

在使用 Redis 处理排队系统时,我的心态可能是错误的,这就是为什么我需要你们的帮助。

所以,我有这个相当简单的队列,负责将电子邮件堆叠到一个集合中,然后检索堆栈中的可用电子邮件并进行发送。

该系统是用 NodeJS 构建的,所以我为此使用了 node-redis 库。

队列(堆栈)应该始终可用,一个点在其顶部添加(推送)新电子邮件,另一端弹出第一个推送的项目。

对于这种方法,我可能也在想 Javascript'ish,根据我在 Redis 文档中找到的内容,它可能不合适,所以我来找你们帮助我获得讲 Redis 语言时的正确心态。

使用一个简单的例子,在 JSON 中,这是我的队列堆栈:

queue = [
 {
  _id: 5a05eec08a7e66eb10ad6361,
  email: "some html content in here",
  domain: "domain.com"
 },
 {
  _id: 5a05eb785710017b7d7a0243,
  email: "some more html content here",
  domain: "domain.com"
 },
 ...
]

并通过查看 Redis Documentation 我发现我可以通过执行以下操作将每封电子邮件推送到堆栈中:

HMSET queue:5a05eec08a7e66eb10ad6361 email "some html content in here" domain "domain.com"
HMSET queue:5a05eb785710017b7d7a0243 email "some more html content here" domain "domain.com"

我可以像这样明确地检索一个 'collection':

HMGET queue:5a05eec08a7e66eb10ad6361 email
HMGET queue:5a05eec08a7e66eb10ad6361 domain
HMGET queue:5a05eb785710017b7d7a0243 email 
HMGET queue:5a05eb785710017b7d7a0243 domain

到现在为止,一切都很普通。但问题是当涉及到一个排队系统时,确实必须使用 language/Database 给你的 PUSH 和 POP 功能。

我确实找到了 Redis 提供的 PUSH 和 POP 机制,但我只能在处理单维 KEY 时使用它。

所以,在我的例子中,不是像这样弹出一个项目:

RPOP email 

我真的需要这样的东西:

RPOP queue //see the abstraction here? calling the stack and not a single item?

反过来 return 我 - 同时删除 - 此队列集合中的最后一项。

所以,

RPOP queue //or whatever other command I couldn't find

应该给我

 {
  _id: 5a05eec08a7e66eb10ad6361,
  email: "some html content in here",
  domain: "domain.com"
 }

...然后,与另一个

RPOP queue

return对我来说

{
  _id: 5a05eb785710017b7d7a0243,
  email: "some more html content here",
  domain: "domain.com"
 }

等等,直到它使这个 "queue" 为空。

我希望我清楚地暴露了我的心态,以及问题本身。

我无法使用 HMGET 机制在代码中迭代,因为对于任何队列,虽然一端可能从底部弹出项目,但另一端可能在其顶部堆叠新项目。因此,通过编码保留一些 'reindexing' 机制有点太过分了。

至此,我开始相信 Redis 没有为我提供支持这种 "multi dimensioned" 堆栈方法的必要工具。很好,恕我直言,Redis 可能不是我需要的答案。

但我知道我目前的心态可能是错误的,Redis 可能提供了一种优雅的方式来处理这个问题,但采用的是一种完全不同的方法。我不能只让它与 RPUSH 和 LPOP 一起工作,因为正如我已经提到的,它只为我提供了一种处理简单的一维 KEY VALUE 的方法。

如果 Redis 不为此提供一些支持,我已经在 NodeJS 端点中实施了一种解决方法。但是你知道,更多的代码意味着更多的潜在错误。

和平

您不需要将队列的内容分解为离散的哈希,除非您打算访问它们的子元素。如果我没理解错的话,你需要的是经典的 LPUSH/RPOP 列表队列模式。该列表中的成员可以是任何东西,但在您的情况下,最简单的方法是只存储每个元素的原始序列化 JSON,例如:

LPUSH queue '{_id: 5a05eec08a7e66eb10ad6361, email: "some html content in here", domain: "domain.com"}'