当我和Redis接近排队系统时,我可能有错误的心态,这就是为什么我需要你们的帮助。
因此,我有一个相当简单的队列,负责将电子邮件堆叠到一个集合中,然后检索堆栈的可用电子邮件并分发它。
该系统是在NodeJS中构建的,因此我使用节点红库。
队列(堆栈)应该是不断可用的,一方面在上面添加(推送)新邮件,另一方面则弹出第一个被推送的项目。
对于这种方法,我可能会想得太过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文件,我发现我可以通过这样的操作将每一封电子邮件推到一个堆栈上:
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在此之前,一切都是很普通的。但问题是,当涉及到一个排队系统时,必须使用语言/数据库提供的推送和弹出功能。
我确实找到了Redis提供的推送和弹出机制,但我只能在处理单维度键时使用它。
所以,在我的例子中,不是弹出一个项目,比如:
RPOP email 我真的需要这样的东西:
RPOP queue //see the abstraction here? calling the stack and not a single item?With反过来将返回我(同时删除)此队列集合中的最后一项。
所以,
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提供了一种优雅的方法来处理这个问题,但方法完全不同。我不能仅仅使它与RPUSH和LPOP一起工作,因为正如我已经提到的,它只为我提供了一种处理简单的一维键值的方法。
如果Redis没有为此提供一些支持,我已经在NodeJS端点中实现了一个解决方案。但你知道,更多的代码意味着更多的潜在错误。
和平
发布于 2017-11-10 23:32:09
您不需要将队列的内容分解为离散散列,除非您打算访问它们的子元素。如果我正确理解,您需要的是经典的LPUSH/RPOP列表队列模式。该列表中的成员可以是任何内容,但在您的示例中,最简单的方法是存储每个元素的原始序列化JSON,例如:
LPUSH queue '{_id: 5a05eec08a7e66eb10ad6361, email: "some html content in here", domain: "domain.com"}'https://stackoverflow.com/questions/47231582
复制相似问题