在使用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端点实现了一个解决方法。但是你知道,更多代码意味着更多潜在的错误。
和平
答案 0 :(得分:1)
除非您打算访问其子元素,否则不需要将队列的内容分成不连续的哈希值。如果我理解正确,那么您需要的是经典的LPUSH / RPOP列表队列模式。该列表中的成员可以是任何内容,但在您的情况下,最简单的方法是只存储每个元素的原始序列化JSON,例如:
LPUSH queue '{_id: 5a05eec08a7e66eb10ad6361, email: "some html content in here", domain: "domain.com"}'