5

Redis pub/sub では、サブスクライバーがいないときに何かが公開されると、データが失われます。

私が欲しかったのは、サブスクライバーがサブスクライブしたときにパブリッシャーに通知するようなものです。

1 つの方法は、発行をループで継続し、発行者が少なくとも 1 人の購読者を見つけたときにループを解除することです。しかし、それは良い方法ではないと思います。(また、指数関数をオフに保つことはできません)。

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

同じ問題を解決するためのより良い方法はありますか?

プレディスを使用しています。

4

1 に答える 1

9

ユースケースについて詳しく説明しない限り、具体的にするのは難しいですが、1人のサブスクライバーがメッセージを受信するのに十分な場合は、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 に答える