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:RAX
、temp-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のパワーが解き放たれます:
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]までご連絡ください。表示されるコードの一部を紹介するために最善を尽くします。
-
Redis Jedis pubsub-jedisライブラリを使用してpub/subシステムを実装する方法
このチュートリアルでは、Jedisライブラリを使用してredispubサブシステムを実装する方法について学習します。 ジェダイライブラリ Jedisは、redisデータストア用のJavaクライアントライブラリです。小さくて非常に使いやすく、redis 2.8.x、3.x.x以降のデータストアと完全に互換性があります。 jedisライブラリの詳細についてはこちらをご覧ください。 Redis Pub / Sub System Redisは、パブリッシュ/サブスクライブメッセージングパラダイムを実装します。このメッセージングパラダイムによれば、メッセージの送信者(発行者)は、メッセージ
-
Roku でチャネルのブロックを解除する方法を学ぶ – 2022 ガイド
ろく は、ユーザーが問題なくテレビでコンテンツをストリーミングできる人気のストリーミング デバイスです。これは、従来のテレビをスマート TV に変える強力なストリーミング スティックです。 Roku デバイスにはさまざまな仕様のさまざまなモデルがあり、多くのチャネルを追加してオンデマンド コンテンツを視聴できます。ただし、それらのいくつかは地理的に制限されているため、サブスクリプションを取得していても、他の国からアクセスすることはできません. 以下をお読みください: 2022 年の Roku デバイスに最適な 6 つのブラウザ iPhone を Roku TV に接続する方法