2017-11-10 270 views
1

在使用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不会为我提供必要的工具来支持这种“多维”堆栈方法。不错,恕我直言,Redis可能不是我需要的答案。

但是我知道我现在可能会有错误的观念,可能Redis提供了一种优雅的方式来处理这个问题,但是从完全不同的方法来看。我不会仅仅使它与RPUSH和LPOP一起工作,因为正如我已经提到的那样,它只是为我提供了一种处理简单的单维KEY VALUEs的方法。

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

和平

回答

1

你并不需要打破你的队列中的内容转换成离散的哈希值,除非你打算访问他们的子元素。如果你我理解正确,你需要的是经典的LPUSH/RPOP列表队列模式。在该列表中的成员可以是任何东西,但在你的情况下,最简单的是只存储每个元素的原始序列化JSON,如:

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

谢谢@埃文 - 哈伯,这是一个非常简单的事情,但我看不到它,因为我在考虑对于Popping/Pushing对象,我需要像LMHPUSH/RMHPOP那种奇怪的东西。 这解决了我的疑问,并解决了暴露问题的思维。 –

+1

太棒了 - 随时可以回来进行进一步的思维调整;) –