この記事では、キューイングとPub/SubのRedisリストを使用して説明します。リストは、LPUSH/RPOPを使用してFIFO/LIFOキューを効果的に実装していますが、Redisのネイティブメカニズムと比較してPUB/Subに対しては非効率的です。この記事では、パフォーマンスTRについても説明します
Redisリストは、キューイング(PUB/SUB)システムの両方を実装する簡単な方法を提供しますが、キューイングに適しています。各ユースケースを分解しましょう。
キューイング: Redisリストは、 LPUSH
(左のプッシュ)とRPOP
(右POP)コマンドを使用して、ファーストイン、ファーストアウト(FIFO)キューを実装します。 LPUSH
リストのヘッドに要素を追加し、 RPOP
テールの要素を削除して返します。これにより、アイテムが追加された順序で処理されるクラシックキューが作成されます。最後の、最初のアウト(LIFO)スタックの場合、 RPUSH
(右プッシュ)とLPOP
(左ポップ)を使用します。
例(fifo queue):
タスクキューを想像してください。労働者は「タスク」という名前のリストからタスクを消費します:
LPUSH tasks "task1"
を使用して、キューにタスクを追加します。BRPOP tasks 0
(ブロックポップ)を使用して、タスクを待ちます。タスクが利用可能になるか、タイムアウト(0は無期限の待機を意味する)に到達するまでBRPOP
ブロックが到達します。タスクが利用可能になると、削除されて処理されます。 Pub/Sub: RedisリストはPub/Subに適合させることができますが、それは彼らの主な強さではありません。 RedisのPUBLISH
とSUBSCRIBE
コマンドを使用したRedisの組み込みのパブ/サブメカニズムは、はるかに効率的で、この目的のために特別に設計されています。 Pub/Subのリストを使用するには、メッセージをリストにプッシュし、購読者が新しいメッセージのリストを繰り返しポーリングすることが含まれます。したがって、Pub/Subの場合、RedisのネイティブPub/Sub機能を使用します。
Redisは、キューイングに適したいくつかのデータ構造を提供し、それぞれにパフォーマンスのトレードオフがあります。
BRPOP
タスクを待っている多くの消費者との重い争いの下でボトルネックになる可能性があります。メモリ使用量は、キューサイズで直線的にスケーリングします。要約すると、リストは単純で低電流キューに適しています。ハイスループット、信頼性、スケーラブルなキューの場合、Redisストリームが好ましい選択です。ソートされたセットは、タスクの優先順位付けが重要な場合に理想的です。
Redisリストだけで本当に信頼できるメッセージキューを実装するのは困難です。 Redisリスト自体は、サーバーのメモリを超えたメッセージの永続性などの機能を提供しません。信頼性を向上させるには、これらの戦略を考慮してください。
LPUSH
およびRPOP
操作をラップ( MULTI
、 EXEC
)に導き、原子性を確保します。これにより、障害が発生した場合の部分操作が防止されます。これらの手法は信頼性を高めますが、極端なシナリオでのデータ損失の可能性を排除しないでください。ミッションクリティカルなアプリケーションには、より堅牢なメッセージキューシステム(例えば、Kafka、RabbitMQ)が推奨されます。
前述のように、RedisリストはPub/Subにとって理想的な選択ではありません。ただし、それらを使用する必要がある場合は、これらのプラクティスに従ってください(これらは回避策であり、ネイティブのPub/Subよりも効率が低いことに留意してください)。
LRANGE
を使用してリストを継続的に投票することは非常に非効率的です。リソースを無駄にし、遅延を増加させます。BLPOP
またはBRPOP
を使用してください:ブロッキングポップ(左ポップ用のBLPOP
、右ポップ用のBRPOP
)はポーリングよりも効率的です。メッセージが利用可能な場合にのみリソースを消費します。重要なことは、Redisのネイティブパブ/サブシステムは、Pub/Subシナリオよりもはるかに優れていることを忘れないでください。これらの「ベストプラクティス」は、タスク用に設計されていないツールを使用するための単なる緩和戦略です。キューイングにRedisリストを使用し、最適なパフォーマンスとスケーラビリティのために、RedisのビルトインPub/Subを公開/購読するために操作を公開/購読するために使用します。
以上がキューイングとパブ/サブにRedisリストを使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。