Redis处理队列管理机制
Redis dealing with queuing management mechanism
在使用 Redis 处理排队系统时,我的心态可能是错误的,这就是为什么我需要你们的帮助。
所以,我有这个相当简单的队列,负责将电子邮件堆叠到一个集合中,然后检索堆栈中的可用电子邮件并进行发送。
该系统是用 NodeJS 构建的,所以我为此使用了 node-redis 库。
队列(堆栈)应该始终可用,一个点在其顶部添加(推送)新电子邮件,另一端弹出第一个推送的项目。
对于这种方法,我可能也在想 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"
我可以像这样明确地检索一个 'collection':
HMGET queue:5a05eec08a7e66eb10ad6361 email
HMGET queue:5a05eec08a7e66eb10ad6361 domain
HMGET queue:5a05eb785710017b7d7a0243 email
HMGET queue:5a05eb785710017b7d7a0243 domain
到现在为止,一切都很普通。但问题是当涉及到一个排队系统时,确实必须使用 language/Database 给你的 PUSH 和 POP 功能。
我确实找到了 Redis 提供的 PUSH 和 POP 机制,但我只能在处理单维 KEY 时使用它。
所以,在我的例子中,不是像这样弹出一个项目:
RPOP email
我真的需要这样的东西:
RPOP queue //see the abstraction here? calling the stack and not a single item?
反过来 return 我 - 同时删除 - 此队列集合中的最后一项。
所以,
RPOP queue //or whatever other command I couldn't find
应该给我
{
_id: 5a05eec08a7e66eb10ad6361,
email: "some html content in here",
domain: "domain.com"
}
...然后,与另一个
RPOP queue
return对我来说
{
_id: 5a05eb785710017b7d7a0243,
email: "some more html content here",
domain: "domain.com"
}
等等,直到它使这个 "queue" 为空。
我希望我清楚地暴露了我的心态,以及问题本身。
我无法使用 HMGET 机制在代码中迭代,因为对于任何队列,虽然一端可能从底部弹出项目,但另一端可能在其顶部堆叠新项目。因此,通过编码保留一些 'reindexing' 机制有点太过分了。
至此,我开始相信 Redis 没有为我提供支持这种 "multi dimensioned" 堆栈方法的必要工具。很好,恕我直言,Redis 可能不是我需要的答案。
但我知道我目前的心态可能是错误的,Redis 可能提供了一种优雅的方式来处理这个问题,但采用的是一种完全不同的方法。我不能只让它与 RPUSH 和 LPOP 一起工作,因为正如我已经提到的,它只为我提供了一种处理简单的一维 KEY VALUE 的方法。
如果 Redis 不为此提供一些支持,我已经在 NodeJS 端点中实施了一种解决方法。但是你知道,更多的代码意味着更多的潜在错误。
和平
您不需要将队列的内容分解为离散的哈希,除非您打算访问它们的子元素。如果我没理解错的话,你需要的是经典的 LPUSH/RPOP 列表队列模式。该列表中的成员可以是任何东西,但在您的情况下,最简单的方法是只存储每个元素的原始序列化 JSON,例如:
LPUSH queue '{_id: 5a05eec08a7e66eb10ad6361, email: "some html content in here", domain: "domain.com"}'
在使用 Redis 处理排队系统时,我的心态可能是错误的,这就是为什么我需要你们的帮助。
所以,我有这个相当简单的队列,负责将电子邮件堆叠到一个集合中,然后检索堆栈中的可用电子邮件并进行发送。
该系统是用 NodeJS 构建的,所以我为此使用了 node-redis 库。
队列(堆栈)应该始终可用,一个点在其顶部添加(推送)新电子邮件,另一端弹出第一个推送的项目。
对于这种方法,我可能也在想 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"
我可以像这样明确地检索一个 'collection':
HMGET queue:5a05eec08a7e66eb10ad6361 email
HMGET queue:5a05eec08a7e66eb10ad6361 domain
HMGET queue:5a05eb785710017b7d7a0243 email
HMGET queue:5a05eb785710017b7d7a0243 domain
到现在为止,一切都很普通。但问题是当涉及到一个排队系统时,确实必须使用 language/Database 给你的 PUSH 和 POP 功能。
我确实找到了 Redis 提供的 PUSH 和 POP 机制,但我只能在处理单维 KEY 时使用它。
所以,在我的例子中,不是像这样弹出一个项目:
RPOP email
我真的需要这样的东西:
RPOP queue //see the abstraction here? calling the stack and not a single item?
反过来 return 我 - 同时删除 - 此队列集合中的最后一项。
所以,
RPOP queue //or whatever other command I couldn't find
应该给我
{
_id: 5a05eec08a7e66eb10ad6361,
email: "some html content in here",
domain: "domain.com"
}
...然后,与另一个
RPOP queue
return对我来说
{
_id: 5a05eb785710017b7d7a0243,
email: "some more html content here",
domain: "domain.com"
}
等等,直到它使这个 "queue" 为空。
我希望我清楚地暴露了我的心态,以及问题本身。
我无法使用 HMGET 机制在代码中迭代,因为对于任何队列,虽然一端可能从底部弹出项目,但另一端可能在其顶部堆叠新项目。因此,通过编码保留一些 'reindexing' 机制有点太过分了。
至此,我开始相信 Redis 没有为我提供支持这种 "multi dimensioned" 堆栈方法的必要工具。很好,恕我直言,Redis 可能不是我需要的答案。
但我知道我目前的心态可能是错误的,Redis 可能提供了一种优雅的方式来处理这个问题,但采用的是一种完全不同的方法。我不能只让它与 RPUSH 和 LPOP 一起工作,因为正如我已经提到的,它只为我提供了一种处理简单的一维 KEY VALUE 的方法。
如果 Redis 不为此提供一些支持,我已经在 NodeJS 端点中实施了一种解决方法。但是你知道,更多的代码意味着更多的潜在错误。
和平
您不需要将队列的内容分解为离散的哈希,除非您打算访问它们的子元素。如果我没理解错的话,你需要的是经典的 LPUSH/RPOP 列表队列模式。该列表中的成员可以是任何东西,但在您的情况下,最简单的方法是只存储每个元素的原始序列化 JSON,例如:
LPUSH queue '{_id: 5a05eec08a7e66eb10ad6361, email: "some html content in here", domain: "domain.com"}'