Redis处理排队管理机制

时间:2017-11-10 21:45:15

标签: redis queue node-redis

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

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

系统内置NodeJS,因此我使用node-redis lib。

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

对于这种方法,我可能会想到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"

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

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

在此之前,一切都很香草。但问题是当它归结为一个排队系统时,必须使用语言/数据库为您提供的PUSH和POP功能。

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

所以,在我的情况下,而不是弹出像:

这样的单个项目
RPOP email 

我真的需要这样的东西:

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

反过来会返回我 - 并在同一时间删除 - 此队列集合中的最后一项。

所以,

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

应该给我

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

...然后,与另一个

RPOP queue

回到我身边

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

所以,直到它呈现这个"队列"空。

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

我不能使用HMGET机制迭代代码,因为任何队列,而一端可能是从底部弹出项目,另一端可能是在它上面堆叠新项目。因此,通过编码保持一些重新索引'机制将是一个太多的黑客攻击。

到目前为止,我开始相信Redis没有为我提供必要的工具来为我提供支持这个多尺寸的"堆栈方法。哪个是好的imho,Redis可能不是我需要的答案。

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

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

和平

1 个答案:

答案 0 :(得分:1)

除非您打算访问其子元素,否则不需要将队列的内容分成不连续的哈希值。如果我理解正确,那么您需要的是经典的LPUSH / RPOP列表队列模式。该列表中的成员可以是任何内容,但在您的情况下,最简单的方法是只存储每个元素的原始序列化JSON,例如:

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