首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理队列管理机制的Redis

处理队列管理机制的Redis
EN

Stack Overflow用户
提问于 2017-11-10 21:45:15
回答 1查看 168关注 0票数 1

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

因此,我有一个相当简单的队列,负责将电子邮件堆叠到一个集合中,然后检索堆栈的可用电子邮件并分发它。

该系统是在NodeJS中构建的,因此我使用节点红库。

队列(堆栈)应该是不断可用的,一方面在上面添加(推送)新邮件,另一方面则弹出第一个被推送的项目。

对于这种方法,我可能会想得太过Javascript‘’ish,而我在Redis文档中发现的东西可能并不合适,所以我来这里是为了帮助我在谈论Redis语言时获得正确的心态。

使用一个简单的例子,在JSON中,下面是我的队列堆栈:

代码语言:javascript
复制
queue = [
 {
  _id: 5a05eec08a7e66eb10ad6361,
  email: "some html content in here",
  domain: "domain.com"
 },
 {
  _id: 5a05eb785710017b7d7a0243,
  email: "some more html content here",
  domain: "domain.com"
 },
 ...
]

通过查看Redis文件,我发现我可以通过这样的操作将每一封电子邮件推到一个堆栈上:

代码语言:javascript
复制
HMSET queue:5a05eec08a7e66eb10ad6361 email "some html content in here" domain "domain.com"
HMSET queue:5a05eb785710017b7d7a0243 email "some more html content here" domain "domain.com"

我可以像这样明确地检索一个“收藏”:

代码语言:javascript
复制
HMGET queue:5a05eec08a7e66eb10ad6361 email
HMGET queue:5a05eec08a7e66eb10ad6361 domain
HMGET queue:5a05eb785710017b7d7a0243 email 
HMGET queue:5a05eb785710017b7d7a0243 domain

在此之前,一切都是很普通的。但问题是,当涉及到一个排队系统时,必须使用语言/数据库提供的推送和弹出功能。

我确实找到了Redis提供的推送和弹出机制,但我只能在处理单维度键时使用它。

所以,在我的例子中,不是弹出一个项目,比如:

代码语言:javascript
复制
RPOP email 

我真的需要这样的东西:

代码语言:javascript
复制
RPOP queue //see the abstraction here? calling the stack and not a single item?

With反过来将返回我(同时删除)此队列集合中的最后一项。

所以,

代码语言:javascript
复制
RPOP queue //or whatever other command I couldn't find

应该给我

代码语言:javascript
复制
 {
  _id: 5a05eec08a7e66eb10ad6361,
  email: "some html content in here",
  domain: "domain.com"
 }

..。然后,和另一个

代码语言:javascript
复制
RPOP queue

回到我身边

代码语言:javascript
复制
{
  _id: 5a05eb785710017b7d7a0243,
  email: "some more html content here",
  domain: "domain.com"
 }

这样一个,直到它把这个“队列”变成空的。

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

我不能使用HMGET机制在代码中迭代,因为作为任何队列,当一端可能从底部弹出项时,另一端可能会在其上堆放新项。因此,通过编写一些“重新索引”机制来保持这种状态有点太麻烦了。

到目前为止,我开始相信Redis没有为我提供必要的工具来为这种“多维”堆栈方法提供支持。这很好,雷迪斯可能不是我需要的答案。

但我意识到,我目前可能有错误的心态,这可能是Redis提供了一种优雅的方法来处理这个问题,但方法完全不同。我不能仅仅使它与RPUSH和LPOP一起工作,因为正如我已经提到的,它只为我提供了一种处理简单的一维键值的方法。

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

和平

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-10 23:32:09

您不需要将队列的内容分解为离散散列,除非您打算访问它们的子元素。如果我正确理解,您需要的是经典的LPUSH/RPOP列表队列模式。该列表中的成员可以是任何内容,但在您的示例中,最简单的方法是存储每个元素的原始序列化JSON,例如:

代码语言:javascript
复制
LPUSH queue '{_id: 5a05eec08a7e66eb10ad6361, email: "some html content in here", domain: "domain.com"}'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47231582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档