15

私は現在、Redis pub/sub アプリケーションでどのチャネルがサブスクライブされているかを知りたいと思っています。クライアントがサーバーに接続すると、次のようなチャネルにクライアントを登録します。

user:user_id

その理由は、誰が「オンライン」であるかを確認できるようにしたいからです。クライアントがこれらのタイプのメッセージを受信することは重要ではないため、現在、クライアントがオンラインであるかどうかを知らずに、やみくもにチャネルにメッセージを送信しています。

アプリケーションをよりスマートにするために、クライアントがオンラインか、pub/sub API を使用していないかを検出できるようにしたいと考えています。クライアントがオフラインの場合は、プッシュできる別の redis キューにメッセージをキャッシュします。彼らがオンラインに戻ったときに彼らに。

これは 100% 正確である必要はありませんが、正確であればあるほど良いでしょう。チャンネルがサブスクライブされたときに汎用キーが作成されないと想定しているため、次のような簡単なことはできません。

redis-cli keys user*すべてのオンライン ユーザーを検索します。

私が考えたもう 1 つの戦略は、ユーザーがチャネルを公開またはチャネルから削除するたびに、独自の Redis セットを維持することです (これは、ユーザーがオンラインに飛び乗ってアプリを閉じると、クライアントが自動的に処理します)。それは私が管理しなければならない追加の複雑さのレイヤーであり、すでに利用可能なデータを使ったより簡単なアプローチがあることを願っています。

4

5 に答える 5

8

Redis 2.8 以降では、次のことができます。

PUBSUB CHANNELS [pattern]

PUBSUB CHANNELSコマンドの複雑さは O(N) です。ここで、N はアクティブなチャネルの数です。

だからあなたの場合:

redis-cli PUBSUB CHANNELS user*

あなたが欲しいと思うでしょう。

于 2016-08-01T06:04:25.110 に答える
3

現在、サブスクライブする方法で「存在する」チャンネルを表示するコマンドはありませんが、「承認された」問題とこれを実装するプルリクエストがあります。

https://github.com/antirez/redis/issues/221
https://github.com/antirez/redis/pull/412

この呼び出しの性質上、スケーリングできるものではないため、「DEBUG」コマンドです。

ただし、問題を解決する方法は他にもいくつかあります。チャンネルが購読されている可能性があると信じる理由がある場合は、メッセージを送信して結果を確認できます。結果は、メッセージを受け取ったサブスクライバーの数です。0 を取得した場合は、それらが存在しないことがわかります。

あなたが増分的であると仮定すると、存在を追跡するためにユーザーのオフセットビットに 1 または 0 を設定するためuser_idsに使用することに興味があるかもしれません。次に、オンラインのユーザー数を確認したり、特定のユーザーがオンラインかどうかを判断したりするためにSETBIT、新しいようなクールなことを行うことができます。BITCOUNTGETBIT

過去に私があなたの問題をより具体的に解決した方法は、私がチャンネルを購読したことを購読マネージャーに知らせることでした. その後、マネージャーは空白のメッセージを送信してチャンネルに「ping」を実行し、サブスクライバーが存在することを確認します。その後、ユーザーがまだオンラインであるかどうかを判断するために、その後もときどきチャンネルに ping を実行します。DEBUG CHANNELS理想的ではありませんが、本番環境で使用するよりはましです。

于 2012-06-09T06:56:54.463 に答える
2

バージョン 2.8.0 以降、redis にはこの場合に役立つ pubsub コマンドがあります。

http://redis.io/commands/pubsub

備考: 現在、2.8.0 の状態はまだ安定していません (RC2)

于 2013-08-17T08:33:23.507 に答える
1

どのチャネルが購読されているかを問い合わせる具体的な方法を知りません。これが発生したときにキーが作成されないことは正しいです。また、このKEYSコマンドは実際にはデバッグ コマンドであるため、本番環境では使用しません。

SISMEMBER <set> <user_id>セットを使用してユーザーがオンラインのときにユーザーを追加し、これをクエリして、メッセージを送信するか、オンラインになったときに処理するために Redis リストに追加するかを決定することについては、正しい考えがあります。

オンライン ユーザーのリストからユーザーを削除できるように、ユーザーがいつログオフするかを把握する必要がありますが、私はあなたのシステムについて十分に知っているわけではありません。

接続されたクライアントがメッセージを送り返して、メッセージが消費されたことをサーバーに通知できる場合、これを使用して、後で取得するためにどのメッセージを保存する必要があるかを追跡できます。

乾杯、マイク

于 2012-06-08T22:48:59.147 に答える