インターネット ビジネスの継続的な成長に伴い、分散システムのアプリケーションはますます普及しています。分散システムにおけるタスクのスケジューリングは重要な機能です。従来のスタンドアロン環境では、タスクのスケジューリングで多くの問題を考慮する必要はありませんが、分散環境では、タスクのスケジューリングが直面する問題はより複雑になります。 Redis は、分散タスク スケジューリングが直面する多くの問題の解決に役立つ高性能インメモリ データベースです。
Redis の動作モード
Redis はメモリ ストレージを使用するため、データ アクセスの速度はディスクに格納されたデータベースよりもはるかに高速です。同時に、Redis は非常に柔軟なデータ構造もサポートしており、さまざまなアプリケーション シナリオをサポートできます。分散タスク スケジューリングでは、Redis をタスク キュー、分散ロック、パブリッシュとサブスクライブなどのさまざまな側面で使用できます。
タスクキューでの Redis のアプリケーション
分散システムでは、タスクを複数のサービスで処理する必要があることがよくあります。このとき、さまざまなサービスによるタスクの処理を調整するためにキューが必要になります。 Redis は、高性能のインメモリ データベースとしてタスク キューで広く使用されています。
単一マシンのタスク キューの場合、Redis はリスト (List) タイプを通じてタスクを保存できます。キューフロントを例にとると、新しいタスクがキューに入ると、lpush コマンドを使用してそのタスクをリストの先頭に挿入できます。サービスがタスクを取り出す必要がある場合、lpop コマンドを使用してリストの最後からタスクを取り出すことができます。タスクの処理が完了したら、delコマンドを使用して、完了したタスクをタスクキューから削除できます。
分散タスク キューでは、複数のサービスが同じタスクを同時に処理することを防ぐために、分散ロックを使用する必要があります。 Redis の SETNX コマンドは、分散ロック機能の実装に役立ちます。サービスがタスクを取得する必要がある場合、まず分散ロックを取得する必要があります。ロックを取得したサービスのみがタスクを取り出して処理できるため、他のサービスがロックの取得に失敗した場合、タスクの取得を続行するにはロックが解除されるまで待つ必要があります。
分散ロックにおける Redis のアプリケーション
分散ロックは、複数のアプリケーションまたはサービス間の共有リソースへのアクセスを調整するテクノロジーです。分散タスク スケジューリングでは、タスクのスケジューリングには複数のサービス間の調整が必要です。現時点では、分散ロックがスムーズなコラボレーションを確保するための鍵となります。
Redis に基づく分散ロックは、SETNX (SET if Not eXists) コマンドを通じて実装できます。サービスがロックを取得する必要がある場合、SETNX コマンドを通じて lock_name という名前のキーと値のペアを Redis に追加する必要があります。設定が成功すると、サービスはロックを取得したことになります。他のサービスもこの操作を実行しようとすると、キーと値のペアが Redis にすでに存在するため、SETNX コマンドは失敗を返します。 Redis タイムアウト期間内にキー名のロックをポーリングできます。別のサービスがすでにロックを保持している場合、現在のサービスはロックの取得を試行する前に一定時間待機します。
ロックリソースを取得した後、処理が完了したら積極的にロックを解放する必要がありますが、Redisのキー有効期限機能をいじってキーと値のペアの有効期限を設定することができます。有効期限に達すると、Redis はキーと値のペアを自動的に削除します。ロック解除のサービス抵抗が突然ハングアップした場合、ロックの有効期限はダウンタイムを考慮する必要があり、通常はダウンタイムによりロックの解除が間に合わないことを防ぐため、ロック時間を長めに設定します。
パブリッシュおよびサブスクライブにおける Redis のアプリケーション
Redis は、分散タスク スケジューリングのパブリッシュおよびサブスクライブ システムにも適用できます。分散環境では、通常、タスクを完了するために異なるサービス間を調整する必要があります。パブリッシュ/サブスクライブ モデルでは、サブスクライバー (Subscriber) が関心のあるメッセージ (Message) をサブスクライブでき、メッセージ パブリッシャー (Publisher) が対応するメッセージをパブリッシュすると、サブスクライバーは対応するメッセージを受信できます。
Redis サブスクライバーの実装は非常に簡単です。パブリッシャーから送信されたメッセージを受信するには、Redis で指定されたチャネル (Channel) をサブスクライブするだけです。パブリッシャーに通知する操作は、Redis のパブリッシュ コマンドを通じて完了できます。パブリッシャーがサブスクライバーにメッセージを送信する必要がある場合は、publish コマンドを実行するだけです。
パブリッシュ/サブスクライブ モードとタスク キュー モードは実装が異なります。パブリッシュ/サブスクライブ モードでは、Redis はメッセージが解放された時点でメッセージの消費が確実に行われるようにする必要があります。サブスクライバがオフラインである可能性があるため、サブスクライバはメッセージがサーバーに配信されることを保証することしかできませんが、メッセージが消費されることは保証できません。
概要
分散タスク スケジューリングでは、Redis が広く使用されています。 Redis は、さまざまな便利なデータ型サポートを提供しており、その高いパフォーマンスにより、分散タスク スケジューリングでの Redis のアプリケーションがより便利になります。複雑な分散タスク スケジューリングの問題に直面する必要がある場合は、開発の困難さと複雑さを大幅に軽減できる Redis の使用を検討できます。
以上が分散タスク スケジューリングにおける Redis の応用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。