2012-08-13 64 views
3

在Redis的发布/订阅如果在没有用户的东西公布,数据类型的丢失。Redis的出版时,没有用户

我想要的是什么样的通知出版商,当用户订阅。

一种方法可以保持在发布一个循环,并打破时,出版商找到至少一个用户环路。但我认为这不是一个好方法。 (我也不能保持指数退后)。

while(1) { 
    $numOfSubscriber = $redis->publish($channel1, $encodePublish); 
    if($numOfSubscriber > 0) 
     break; 
} 

有没有更好的方法来解决同样的问题?

我正在使用Predis。

回答

6

很难,除非你解释一下你的用例是具体的,但如果它是足够了一个订户得到任何消息,你可以使用Redis的列表实现的队列和存储所有的消息出现,同时发布。伪代码:

出版商:

# Persist message in a queue 
lpush channel1.queue message 
# Publish message to any connected subscriber 
publish channel1 message 

认购人:

# Subscribe to channel1 
subscribe channel1 
# Process any persisted messages 
brpop channel1.queue 

编辑:另一种解决办法,如果没有用户那里出版商只存储信息:

出版商:

subscribers = publish channel1 message 
if subscribers == 0 
    lpush channel1.queue message 

认购人:

# handle stored messages 
while(message = rpop channel1.queue) 
    # process message 

# subscribe for new messages 
subscribe channel1 
+0

我并不想真正存储任何值,在我的应用我也不在乎是当出版商出版应该有一些用户捕捉该消息没有把出版商在一个循环。如果订阅者在发布者之后启动,则可能会错过发布者的消息。 – amitchhajer 2012-08-14 10:41:54

+1

是的,这就是为什么你可以存储它们,让用户弹出它们。或者只有在没有用户的情况下才可以推送它们。但正如我所说,没有关于你的情况的更多信息,很难给出直接的建议。 – 2012-08-14 10:46:22

+0

我的用例是:如果其他工作人员(一个发送ack)准备就绪,我想向其中一个工作人员发送确认以开始工作并将一些数据推送到队列中。所以它发送了确认信息,工作人员开始推送数据。这是否更好解释?我试图解释我的用例。一种解决方案可能是保留一套pub/sub来控制。 – amitchhajer 2012-08-14 10:52:42

相关问题