5

在 Redis pub/sub 中,如果在没有订阅者的情况下发布了某些内容,那么数据就会丢失。

我想要的是订阅者订阅时向发布者发出的通知。

一种方法是保持循环发布并在发布者找到至少一个订阅者时打破循环。但我不认为这是一个好方法。(我也不能保持指数回退)。

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

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

我正在使用 Predis。

4

1 回答 1

9

除非您详细说明您的用例,否则很难具体说明,但如果一个订阅者收到任何消息就足够了,您可以使用 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
于 2012-08-13T12:45:48.727 回答