在Redis pub / sub中,如果没有订阅者发布了某些内容,则数据会丢失。
我想要的是在订阅订阅时向发布商发送通知。
一种方法是在发布者找到至少一个订阅者时保持循环发布并打破循环。但我认为这不是一个好方法。 (我也不能保持指数退缩)。
while(1) {
$numOfSubscriber = $redis->publish($channel1, $encodePublish);
if($numOfSubscriber > 0)
break;
}
有没有更好的方法来解决同样的问题?
我正在使用Predis。
答案 0 :(得分:7)
除非您更详细地解释您的用例,否则很难具体说明,但如果一个订阅者获得任何消息就足够了,您可以使用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