在使用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端点实施了一种解决方法。但是你知道,更多的代码意味着更多的潜在错误。
和平
谢谢@埃文 - 哈伯,这是一个非常简单的事情,但我看不到它,因为我在考虑对于Popping/Pushing对象,我需要像LMHPUSH/RMHPOP那种奇怪的东西。 这解决了我的疑问,并解决了暴露问题的思维。 –
太棒了 - 随时可以回来进行进一步的思维调整;) –