redis pub / sub模型是否需要与redis的持久连接?

时间:2011-10-05 14:26:42

标签: redis publish-subscribe

在Web应用程序中,如果我需要将一个事件写入队列,我会建立一个连接redis来编写事件。

现在,如果我想要另一个后端进程(比如一个守护进程或cron作业)来处理或以redis方式发布事件,我是否需要持久连接?<​​/ p>

对这个发布/订阅过程在Web应用程序中的工作方式感到困惑。

3 个答案:

答案 0 :(得分:43)

Redis基本上有两种不同的消息传递模型:

  • 火与忘记/一对多:Pub / Sub。在消息被PUBLISH-ed时,所有订阅者都将收到它,但此消息将永远丢失。如果没有订阅客户端,则无法将其恢复。
  • 持久队列/一对一:列表,可能与阻止命令(如BLPOP)一起使用。对于列表,您有一个生产者推入列表,一个或多个消费者等待元素,但一个消息将只到达一个等待的客户。使用列表,您有持久性,消息将等待客户端弹出它们而不是消失。因此,即使没有人在监听,也会有积压(与可用内存一样大,或者您可以使用LTRIM限制积压)。

我希望这很清楚。我建议您研究以下命令以了解有关Redis和消息传递语义的更多信息:

  • LPUSH / RPUSH,RPOP / LPOP,BRPOP / BLPOP
  • 发布,订阅,PSUBSCRIBE

此命令的文档可在redis.io上找到

答案 1 :(得分:2)

我不完全确定,但我相信是的,pub / sub需要持久连接。

作为另一种选择,我会看一看resque以及它如何处理。它不是使用pub / sub而是简单地将项添加到redis中的列表中,然后您拥有的任何守护程序或cron作业都可以使用lpop命令来获取第一个。

很抱歉只给出了一个伪答案,然后是一个插件。

答案 2 :(得分:1)

使用BLPOP代替LPOP