没有订阅者时Redis发布

ami*_*jer 4 publish-subscribe redis

在Redis pub/sub中,如果没有订户时发布了某些内容,则数据会丢失.

我想要的是在订阅订阅时向发布者发送通知.

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

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

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

我正在使用Predis.

Lin*_*iel 8

除非您更详细地解释您的用例,否则很难具体说明,但如果一个订阅者获得任何消息就足够了,您可以使用redis列表实现队列并将所有消息存储在那里,同时还要发布.伪代码:

出版商:

# Persist message in a queue
lpush channel1.queue message
# Publish message to any connected subscriber
publish channel1 message
Run Code Online (Sandbox Code Playgroud)

订户:

# Subscribe to channel1
subscribe channel1
# Process any persisted messages
brpop channel1.queue
Run Code Online (Sandbox Code Playgroud)

编辑:另一种解决方案,如果没有订阅者,发布者只存储消息:

出版商:

subscribers = publish channel1 message
if subscribers == 0
  lpush channel1.queue message
Run Code Online (Sandbox Code Playgroud)

订户:

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

# subscribe for new messages
subscribe channel1
Run Code Online (Sandbox Code Playgroud)