Redis
 Computer >> コンピューター >  >> プログラミング >> Redis

Redis Pub / Sub:ハウツーガイド

Redis pub / subに関する概要記事では、pub / subの目的について説明し、特にRedis pub / subの設計上の選択について説明します。次に、Redis pub / subの各主要概念をステップスルーして、Redis pub/subの使用方法について説明します。 / sub:noderedis node.jsクライアントを使用したチャネル、パブリッシュ、サブスクライブ、およびパターンマッチング。

チャンネルを理解する

チャネル pub/subsystemで公開されたメッセージを分類するために使用される名前です。チャネルには、system-health:i-36a44b83のようなシステム依存の名前を付けることができます 、trade-prices:RAXtemp-reading:living-room 、またはeventsのような非常に一般的なもの 。チャネルに表示されるデータに関心のあるサブスクライバーは誰でもそのチャネルを聞くことができ、システムの成長に合わせて新しいパブリッシャーとサブスクライバーを簡単に追加できます。

Redisサーバーでアクティブなチャネルを見つけるには、PUBSUB CHANNELSを使用できます。 コマンド。システムがまだpub/subに使用されていない場合は何も返しません:

$ redis-cli pubsub channels
(empty list or set)

チャネルは、サブスクライバーがメッセージをリッスンしているときにのみシステムに存在するため、チャネルを「作成」または「削除」する必要はありません。チャネルは、サブスクライバーがリッスンしている間のみ存在します。これを確認するには、redis-cliを使用できます 1つのコンソールウィンドウでサブスクライバーとして機能し、PUBSUB CHANNELSを実行します 再び別のウィンドウで:

コンソール1:

$ redis-cli subscribe events
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "events"
3) (integer) 1

コンソール2:

$ redis-cli pubsub channels
1) "events"

コンソール1が切断されるとすぐに、システムにはチャネルがなくなります。

メッセージの公開 コマンド構文

PUBLISH コマンドはメッセージを公開するために使用されます。

PUBLISH channel message

チャネルをリッスンしているすべてのサブスクライバーにメッセージが送信されます。メッセージを受信するサブスクライバーがいない場合、メッセージはドロップされます。

Node.jsの例

Redisへの通常の接続を作成した後、publishは他のコマンドと同じように使用できます:

var client = require("redis").createClient();
client.publish("temp-reading:living-room", "37.0");
他のRedisコマンドでの使用

チャネルへのデータの公開は高速な操作であるため、他の操作と組み合わせて一般的に使用されます。このような操作を組み合わせると、Redisのパワーが解き放たれます:

var client = require("redis").createClient();

client.multi()
  .publish("temp-reading:living-room", "37.0")
  .lpush("recent-temperatures", "37.0")
  .ltrim("recent-temperatures", 0, 99)
  .exec();

これは、pub / subシステムの前の例と同じ操作ですが、同じMULTI/EXEC トランザクションでは、温度もリストにプッシュされ、最新の100個の温度が保持されます。

この短い例は、Redis pub/subをメッセージ履歴を含むより大きなシステムデザインに統合する方法を示しています。上記のような操作により、他のクライアントは最近の値を照会したり、新しい値をサブスクライブしたりできます。

メッセージの購読 コマンド構文

SUBSCRIBE コマンドは、チャネルをサブスクライブするために使用されます。このコマンドは、クライアントを特別な「サブスクライブ」状態にし、追加のSUBSCRIBE以外のコマンドを送信しなくなります。 またはUNSUBSCRIBE コマンド。

SUBSCRIBE channel [channel ...]

Node.jsの例

このサブスクライバーは、以前のパブリッシャーの例で使用できます:

var subscriber = require("redis").createClient();

subscriber.on("message", function(channel, message) {
  console.log("A temperature of " + message + " was read.");
});

subscriber.subscribe("temp-reading:living-room");

これは、メッセージが到着するたびに関数を呼び出す単純なイベントエミッターを使用します。処理機能は、今すぐコンソールに温度を記録するだけです–それは何でもできます。

サブスクライバーで他のコマンドを使用する

前述のように、サブスクライブされたクライアントは特別なモードであり、他のコマンドに使用することはできません。他のコマンドを使用するには、Redisへの個別のクライアント接続を作成します:

var redis = require("redis")
  , subscriber = redis.createClient()
  , client = redis.createClient();

subscriber.on("message", function(channel, message) {
  console.log("A temperature of " + message + " was read.");
  client.incr("temp-count");
});

subscriber.subscribe("temp-reading:living-room");

このハンドラーはメッセージをコンソールに記録し、Redisカウンターをインクリメントします。場合によっては、結果を計算してから、他のサブスクライバーが読み取れるように別のチャネルにその結果を公開することがあります。無限ループが発生するため、リッスンしている同じチャネルに結果を公開しないでください:)

> パターンマッチング コマンド構文

PSUBSCRIBE コマンドはチャネルパターンのマッチングに使用されます。

PSUBSCRIBE pattern [pattern ...]

これは通常のSUBSCRIBEとまったく同じように機能します コマンドですが、パターンに一致する名前のチャネルを一致させることができます。これにより、パブリッシャーは公開している情報について非常に具体的になり、サブスクライバーは正確な名前を知らなくても多くのチャンネルを聞くことができます。

サポートされているパターンは単純です:* 任意の文字に一致します、? 単一の文字に一致し、角かっこを使用して、[acd]などの受け入れ可能な文字のセットに一致させることができます。 。

複数の部屋の温度測定値を一致させます:

PSUBSCRIBE temp-reading:*

site-link:logo:a:clickrateなどのA/Bテストのイベントを照合します およびsite-link:logo:b:clickrate

PSUBSCRIBE site-link:logo:?:clickrate

system-health:us-east-1a:i-36a44b83のような公開されたイベントについて、一連のAWSインスタンス間でイベントを照合します およびsystem-health:us-east-1c:i-73657420636f636f6

PSUBSCRIBE system-health:us-east-1[acd]:i-*

Node.jsの例

この例では、以前の公開例でも使用できますが、温度は、温度が読み取られた部屋とともにログに記録されます。

var subscriber = require("redis").createClient();

subscriber.on("pmessage", function(pattern, channel, message) {
  var room = channel.split(":")[1];
  console.log("A temperature of " + message + " was read in " + room);
});

subscriber.psubscribe("temp-reading:*");

パターンベースのサブスクライバーは、コールバックでさらにいくつかの詳細を取得します。チャネルとメッセージだけでなく、一致した特定のパターンです。サブスクライバーは複数のチャネルまたはパターンでリッスンできるためです。

サイドノート:PUBLISHのパフォーマンス特性

Redisのすべてのコマンドには文書化された時間計算量があり、ほとんどの場合、これらの複雑さは直感的です。 PUBLISH以降 操作は非常に簡単に感じます(ほとんどSETのように) )その複雑さはO(1)であると考えるかもしれません。実際、PUBLISHの時間計算量 サブスクライバーの動作に応じて直線的に増加します。

PUBLISHの場合 コマンドを実行すると、チャネルに一致する可能性のあるサブスクライブされたすべてのパターンをステップスルーする必要があります メッセージを受信する必要のあるすべてのサブスクライバーは、O(N + M)の時間計算量になります。

ほとんどのデプロイメントでは、PUBLISHの複雑さでパフォーマンスの問題が発生することはありません。 、ただし、そのコマンドのパフォーマンスを経時的に追跡することは依然として賢明です。コードがリッスンするチャネルのパターンを自動的に生成する場合は注意が必要です。

ここにあなたのコードはありますか?

Redis pub/subを使用して構築されたアプリのいくつかの優れた例のウォークスルーを紹介したいと思います。いくつかの良い例を知っている場合は、[email protected]までご連絡ください。表示されるコードの一部を紹介するために最善を尽くします。


  1. Redis Jedis pubsub-jedisライブラリを使用してpub/subシステムを実装する方法

    このチュートリアルでは、Jedisライブラリを使用してredispubサブシステムを実装する方法について学習します。 ジェダイライブラリ Jedisは、redisデータストア用のJavaクライアントライブラリです。小さくて非常に使いやすく、redis 2.8.x、3.x.x以降のデータストアと完全に互換性があります。 jedisライブラリの詳細についてはこちらをご覧ください。 Redis Pub / Sub System Redisは、パブリッシュ/サブスクライブメッセージングパラダイムを実装します。このメッセージングパラダイムによれば、メッセージの送信者(発行者)は、メッセージ

  2. Roku でチャネルのブロックを解除する方法を学ぶ – 2022 ガイド

    ろく は、ユーザーが問題なくテレビでコンテンツをストリーミングできる人気のストリーミング デバイスです。これは、従来のテレビをスマート TV に変える強力なストリーミング スティックです。 Roku デバイスにはさまざまな仕様のさまざまなモデルがあり、多くのチャネルを追加してオンデマンド コンテンツを視聴できます。ただし、それらのいくつかは地理的に制限されているため、サブスクリプションを取得していても、他の国からアクセスすることはできません. 以下をお読みください: 2022 年の Roku デバイスに最適な 6 つのブラウザ iPhone を Roku TV に接続する方法