インターネット アプリケーションの発展に伴い、分散システムは避けられない傾向になりました。分散システムでは、複数のサービス間でデータのやり取りが必要であり、これらのデータのやり取りは一連のトランザクションとみなすことができます。複数のサービスがトランザクション上で同時に動作する場合、同時実行制御が必要です。
Redis は、分散システムで広く使用されている高性能のキー/値データベースです。トランザクションや監視など、さまざまなデータ構造とコマンドをサポートしているため、分散システムでの同時実行制御に最適です。この記事では、Redis が分散トランザクションの同時実行制御を実装する方法を詳しく紹介します。
1. Redis トランザクション
Redis トランザクションはアトミックな操作シーケンスです。これらの操作は 1 つのコマンドにパッケージ化し、別のステップで実行するために Redis サーバーに渡すことができるため、トランザクションのアトミック性が保証されます。 Redis トランザクションでは、MULTI コマンドを使用してトランザクションを開始し、EXEC コマンドを使用してトランザクションを送信し、DISCARD コマンドを使用してトランザクションをキャンセルできます。
Redis トランザクション内のコマンドは、トランザクションの開始後、コマンドごとにリクエストを送信せずに継続的に実行できます。クライアントはすべてのコマンドを実行した後、EXEC コマンドを使用してコマンドをバッチで Redis サーバーに送信できます。トランザクションの実行中にエラーが発生した場合、Redis はトランザクションをキャンセルし、すべての変更を禁止します。これにより、トランザクション内のすべての操作が実行されるか、何も実行されないかが保証されます。
2. Redis の監視
Redis の監視は、Redis が分散トランザクションを実装するための鍵です。 WATCH コマンドを使用して、データベース内の 1 つ以上のキーを監視します。 LIST、SET、ZSET、HASH、STRING などのデータ型では、監視対象のキーが存在する必要があります。監視中にこれらのキーが変更されると、トランザクションは正常にコミットされません。監視中に、クライアントは MULTI コマンドを使用して別のトランザクションを開始できます。
たとえば、次のコードは Redis 監視を使用します:
WATCH balance balance = GET balance balance = balance - 10 MULTI SET balance $balance EXEC
このコードは、「balance」という名前のキーを監視し、GET コマンドを使用してこのキーからデータを取得し、データを転送します。 10を引きます。次に、MULTI コマンドを使用してトランザクションを開始し、データを「残高」に書き戻します。
このトランザクションの他のクライアントも「balance」キーを監視し、クライアントが MULTI コマンドを実行する前にこのキーを変更すると、トランザクションは失敗します。トランザクションが正常に送信された場合、トランザクションに含まれるすべての操作が Redis サーバーで実行されるまで、他のクライアントは監視対象のキーを変更できません。
3. Redis 分散ロック
複数のクライアントで同時に Redis 監視コマンドを呼び出すことによって引き起こされる競合やデッドロックの問題を回避するために、分散ロックを使用できます。 Redis は、スタンドアロン ロックとクラスター ロックという 2 種類の分散ロックを提供します。
1. 単一マシン ロック
単一マシン ロックは、最も単純な分散ロックの実装です。スタンドアロン ロックでは、SETNX コマンドを使用してロック用のキー値を設定できます。たとえば、次のコードはスタンドアロン ロックを使用します:
SETNX lock_key $current_time
このコードは値を「lock_key」に設定します。このキーが以前に存在しなかった場合、設定は成功し、1 が返されます。それ以外の場合は、ロックが失敗したことを示す 0 が返されます。ロック期間中、他のクライアントはこのキーを変更できませんが、この時点では、クライアントは独自の操作を実行できます。クライアントは操作を完了したら、DEL コマンドを使用してロックを解放する必要があります。これにより、「lock_key」が削除され、ロックが解除されます。
2. クラスター ロック
クラスター ロックは、より強力な分散ロックの実装です。クラスター ロックでは、マルチノード ロックに Redlock アルゴリズムを使用できます。 Redlock アルゴリズムは、クロック同期に基づく分散ロック アルゴリズムです。 Redlock アルゴリズムでは、クライアントは最初にロックを取得し、現在の時刻をロックの有効期限として使用します。また、クライアントは他の Redis サーバーからロックを取得して、このロックが複数のノード間で一貫していることを確認する必要があります。ロック期間中、クライアントは独自の操作を実行できます。クライアントが操作を完了したら、ロックを解放する必要があります。これにより、ロックが削除され、すべての Redis サーバーのロックも同時に削除されます。
4. 概要
インターネット アプリケーション開発では、分散トランザクションと同時実行制御が非常に重要です。 Redis はトランザクション、監視、分散ロックなどのメカニズムを提供するため、分散システムでの同時実行制御に適しています。これらのメカニズムに精通していれば、開発者が分散システムをより適切に設計および開発し、分散トランザクションと同時実行制御の問題を解決できるようになります。
以上がRedisが実装する分散トランザクションの同時実行制御について詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。