Redis におけるメッセージキューと遅延メッセージキューの実装方法についての簡単な説明
Redis はメッセージ キューと遅延メッセージ キューをどのように実装しますか?以下の記事ではRedisにおけるメッセージキューと遅延メッセージキューの実装方法を紹介しますので、ご参考になれば幸いです。
Redis に関しては、キャッシュとして考える人が多いかもしれません。実際、Redis はいくつかの単純なメッセージ キューの目的も実装できます。リスト データを使用できます。キューを実装するための構造体。 [関連する推奨事項: Redis ビデオ チュートリアル ]
list
lpush (左プッシュ)
by queue Store のいくつかのコマンド左側から入れます
rpush (右プッシュ)
キューの右側から格納します
lpop (左ポップ)
Takeキューの左側から取り出します
rpop (right Pop)
キューの右側から取り出します
上記の 4 つのコマンドは list ヘルプを使用できます。キューまたはスタックを実装します。キューの特性は高度です まず、スタックの特性は先入れ後出しです。
したがって、キュー実装では lpush rpop または rpush lpop を使用できます。
スタック実装は lpush lpop または rpush rpop です。
#コマンド デモンストレーション キューを使用します
プロデューサーがメッセージを公開します
まず、rpush を使用して、notify-queue というキューに 5 つの要素、つまり 1 2 3 4 5 を追加します。これは、プロデューサーとしてメッセージをパブリッシュするためのものです。##消費者消費ニュース
プロデューサが rpush を使用しているため、コンシューマは lpop を使用する必要があります。下の図を参照してください。-queue が 1 から順番にメッセージを消費することを通知し続けています。最終的に、キューにはメッセージがなく、ポップアップは常に空になりますlpop を使用して上記のメッセージを消費すると、メッセージが消費された後、pop に移動するたびに空のメッセージが読み取られることがわかります。上記は手動で実行するコマンドですが、書かれたコード プログラムがデータをポップ (データのプル) し続けると、空のポーリング (無駄な読み取り) が発生し、 は両方とも High にプルされます。これにより、クライアントの CPU 消費量が増加し、Redis の QPS が増加します。これらの無駄な操作により、他のクライアントの Redis へのアクセスの応答が遅くなる可能性があります。
解決策 A (休止状態)
空のポーリングはクライアントと Redis の両方でより多くのリソース消費を引き起こすため、クライアントに空のデータを受信したときに 1 秒間スリープし、1 秒後にデータをプルすることで、消費量を削減できます#Thread.sleep(1000) このソリューションにも欠陥があります。つまり、メッセージ消費の遅延が増加します。コンシューマーが 1 つだけの場合、遅延は 1 秒です。つまり、空のポーリングの後、たまたまスリープ状態になっていますが、この時点でたまたまメッセージが到着します。それでも、
コンシューマが複数ある場合、各コンシューマのスリープ時間をずらすことで多少のレイテンシは減りますが、何か良い方法はありますか? ほぼ0を達成できる方法待ち時間?
ソリューション B (読み取りのブロック)実際には、キュー データの取得に関する Redis のコマンドが 2 つあります。つまり、読み取りのブロックです。
blpop (左ポップのブロック)
brpop (右ポップのブロック)
キューにデータがない場合、読み取りのブロックは休止状態に入ります。メッセージが到着すると、すぐに反応します。データを読み取るため、lpop/rpop の代わりに blpop/brpop を使用すると、メッセージ遅延の問題を解決できます。
引き続き 3 つの属性、6、7、8
blpop を使用してキューを読み取ります。最後のパラメータは、読み取りをブロックするための待ち時間です。この時間が経過してもメッセージがない場合は、nil が返されます。この時点で、引き続き blpop 操作を繰り返すことができます。
クライアントが読み取りブロックを使用する場合、ブロック時間が長すぎると、サービスは通常、それをアイドル接続として扱い、リソースを占有する無駄な接続を減らすために積極的に接続を切断します。このとき、クライアントは例外をスローします。
したがって、クライアントがブロッキングを使用する場合は注意してください。例外をキャッチし、再試行するなど、それに応じて処理する必要があります。
Java クライアントはメッセージ キューを実装しますコマンド ライン クライアント redis-cli が Java に変更される点を除いて、アイデアは上記と同じです。 1 つのスレッドまたは複数のスレッドが rpush,
を公開します。別のスレッドまたは複数のスレッドが BLPOP 消費を実行します。完成したコードは次のとおりです: https://github.com/qiaomengnan16/redis-demo/tree/main/redis-queue
Publisher
# サブスクライバ
遅延キューは、メッセージが送信された後ではなく、メッセージが送信されてからコンシューマによって消費されるまでの時間を指します。コンシューマはメッセージをすぐに読み取ることができます。
zset が役立ちますまず、zset はスコアでソートでき、スコアはタイムスタンプを保存できます。したがって、メッセージをパブリッシュするたびに、現在のタイムスタンプと遅延したタイムスタンプを使用します。メッセージを受信すると、zset データをインターセプトし、現在の時刻を満たしたメッセージを取得します (つまり、現在のタイムスタンプ以下のスコアを持つデータが取得されます。現在のタイムスタンプ以下のスコアは、メッセージが時間に達しました。メッセージが大きい場合は、消費するまでにしばらく待つ必要があることを意味します)。
主要コマンド zadd (パブリッシャー)、zrangebyscore (サブスクライバー)、zrem (サブスクライバーはデータ消費後に削除)
コマンドの実装
zadd を使用して 4 つのデータを追加しました。これらは 1 秒、2 秒、3 秒後に消費できるデータです (擬似的に、これは実際には単なるスコアです)。また、その後に消費できる kafka もあります。 10 秒です。
現在 3 秒目の場合は、1 秒以上 3 秒以下の zset 内のデータを取得します。この間隔のデータはまさに私たちが消費できるものであるため、はい、条件を満たす 3 つのデータを取り出したことがわかります。一度に 1 つのデータを消費する場合は、制限を追加できます。次の図は、消費できる最初のデータを取り出していることがわかります。 list の lpop/ や blpop とは異なることに注意してください (これらは、データがポップアップすると元のキュー内のデータを自動的に削除します)。データは取得されますが、zrem を使用しない場合は、それを削除してください。このデータはまだ zset に存在するため、他の人によって読み取られます。
しかし、zrem 最初に他の人によって削除 (消費) されている可能性があるため、コードは次のことも判断する必要があります。 zrem の戻り値が 0 より大きい場合、このメッセージが正常にプリエンプトされたかどうかが判断され、成功後にメッセージが正しく消費されます。
#コードの実装
パブリッシャー
# #Subscriber
##遅延効果をテストする
#完全なコード アドレス: https: //github.com/qiaomengnan16/redis-demo/tree/main/redis-layed-queue
##上記で実装した遅延キューに問題があり、zremを使用してデータを取得するかどうかを判断する際、データが取得できていない可能性が高く、このまま読み続けると取得できない可能性があります。したがって、Lua スクリプトを使用して最適化を実行できます ( zrangebyscore と zrem をアトミックな操作にすることで、マルチスレッドの競合と取得できないリソースの無駄を回避できます)。
#結論
プログラミング関連の知識について詳しくは、プログラミング入門をご覧ください。 !
以上がRedis におけるメッセージキューと遅延メッセージキューの実装方法についての簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Redisクラスターモードは、シャードを介してRedisインスタンスを複数のサーバーに展開し、スケーラビリティと可用性を向上させます。構造の手順は次のとおりです。異なるポートで奇妙なRedisインスタンスを作成します。 3つのセンチネルインスタンスを作成し、Redisインスタンスを監視し、フェールオーバーを監視します。 Sentinel構成ファイルを構成し、Redisインスタンス情報とフェールオーバー設定の監視を追加します。 Redisインスタンス構成ファイルを構成し、クラスターモードを有効にし、クラスター情報ファイルパスを指定します。各Redisインスタンスの情報を含むnodes.confファイルを作成します。クラスターを起動し、CREATEコマンドを実行してクラスターを作成し、レプリカの数を指定します。クラスターにログインしてクラスター情報コマンドを実行して、クラスターステータスを確認します。作る

Redisはハッシュテーブルを使用してデータを保存し、文字列、リスト、ハッシュテーブル、コレクション、注文コレクションなどのデータ構造をサポートします。 Redisは、スナップショット(RDB)を介してデータを維持し、書き込み専用(AOF)メカニズムを追加します。 Redisは、マスタースレーブレプリケーションを使用して、データの可用性を向上させます。 Redisは、シングルスレッドイベントループを使用して接続とコマンドを処理して、データの原子性と一貫性を確保します。 Redisは、キーの有効期限を設定し、怠zyな削除メカニズムを使用して有効期限キーを削除します。

Redis-Serverが見つからない問題を解決するための手順:インストールを確認して、Redisが正しくインストールされていることを確認します。環境変数Redis_hostとredis_portを設定します。 Redis Server Redis-Serverを起動します。サーバーがRedis-Cli pingを実行しているかどうかを確認します。

Redisのすべてのキーを表示するには、3つの方法があります。キーコマンドを使用して、指定されたパターンに一致するすべてのキーを返します。スキャンコマンドを使用してキーを繰り返し、キーのセットを返します。情報コマンドを使用して、キーの総数を取得します。

Redisソースコードを理解する最良の方法は、段階的に進むことです。Redisの基本に精通してください。開始点として特定のモジュールまたは機能を選択します。モジュールまたは機能のエントリポイントから始めて、行ごとにコードを表示します。関数コールチェーンを介してコードを表示します。 Redisが使用する基礎となるデータ構造に精通してください。 Redisが使用するアルゴリズムを特定します。

Redis指令を使用するには、次の手順が必要です。Redisクライアントを開きます。コマンド(動詞キー値)を入力します。必要なパラメーターを提供します(指示ごとに異なります)。 Enterを押してコマンドを実行します。 Redisは、操作の結果を示す応答を返します(通常はOKまたは-ERR)。

Redisバージョン番号を表示するには、次の3つの方法を使用できます。(1)情報コマンドを入力し、(2) - versionオプションでサーバーを起動し、(3)構成ファイルを表示します。

次の2つの方法を使用して、Redisのデータをクリアすることができます。Flushallコマンド:データベース内のすべてのキーと値を削除します。 Config ResetStatコマンド:データベースのすべての状態(キー、値、その他の統計を含む)をリセットします。
