分散ロックは、実際には、分散システムを制御して共有リソースを秩序ある方法で操作し、相互排他によって一貫性を維持するものとして理解できます。
不適切な例を挙げます: (推奨学習: Redis ビデオ チュートリアル)
前提条件 共有リソースさまざまな本が置かれた家です。分散システムでは、家に入って本を読みたい人が集まります。分散ロックにより、家には 1 つのドアしかなく、一度に 1 人だけが入ることができ、ドアには 1 つのみしか入れません。 1キー。すると多くの人が本を読みたいと思って、分かった、並んで、最初の人が鍵を取り、ドアを開け、本を読みに中に入り、ドアに鍵をかける。そして、2人目の人は鍵を持っていないので、ただ待って、最初のものが出るのを待ってからそれを取得します キーで入力する、など
同時に顧客が 1 人だけであることを確認します。クライアントはロックを取得できます。つまり、共有リソースを操作できます。
セキュリティロックされたサービスのみがロック解除権限を持つことができます。つまり、a はロックの追加を許可できず、bcd はロックを解除できます。ロックを解除できる場合、分散ロックは意味がありません。
考えられる状況は次のとおりです。 a がクエリを実行すると、ロックが保持されていることがわかり、ロックを解除する準備をしています。このとき、a が突然保持します。いくつかのロックの有効期限が切れたため、b がロックを取得します。a のロックの有効期限が切れたため、b がロックを取得します。時間が経過しても、a はロックを解除する 2 番目のステップを実行し続けます。検証が実行されない場合、b が保持しているロックは削除されます。
#デッドロックの回避##デッドロックが発生した場合この問題が発生すると、後続のサービスはロックを取得できなくなり、共有リソースに対してそれ以上の操作を実行できなくなります
ロック操作とロック解除操作がアトミック操作であることを確認してください ##これは実際には分散ロックの実装の問題です。redis を使用して分散ロックを実装すると仮定します。Lock 操作を追加すると仮定すると、操作手順は 2 つの手順に分かれます:
1. キーを設定します。 set (key, value) 2. キーの有効期限を設定します set を実装した直後にプログラムがクラッシュすると、キーが有効期限を設定していないためにデッドロックが発生します。#分散ロックの実装方法
分散ロックを実装するには、データベース、Redis など、上記の条件が満たされる限り、さまざまな方法があります。 , Zookeeper. ここではまず、redis を使用して分散ロックを実装する方法について説明します
分散ロックを実装するための鍵は、分散アプリケーション サーバーに加えて、ロック情報を保存するストレージ サーバーを構築します。現時点では、Redis を簡単に考えることができます。まず、Redis サーバーを構築し、Redis サーバーを使用してロック情報を保存する必要があります。 redis を使用して分散ロックを実装するredis コマンド セット キー値 NX EX max-lock-time を使用してロックを実装する
使用するRedis コマンド EVAL はロック解除を実現します。
実装時に注意すべきいくつかの重要なポイント:
1. ロック情報の有効期限が切れてタイムアウトする必要があり、スレッドを許可することはできません長時間ロックを保持するとデッドロックが発生する可能性があります; 2. 同時にロックを取得できるスレッドは 1 つだけです。
使用するいくつかの Redis コマンド:setnx(key, value): "set if not exits"、キーと値が存在しない場合は成功します。キャッシュに追加された場合は 1 を返し、それ以外の場合は 0 を返します。 get(key): キーに対応する値を取得します。キーが存在しない場合は、nil を返します。
getset(key, value): まず key に対応する値を取得し、存在しない場合は nil を返し、古い値を新しい値に更新します。
expire(key, 秒): Key-Value の有効期間を秒に設定します。
Redis 関連の技術記事の詳細については、「Redis データベース チュートリアルの使用方法の概要」 列にアクセスして学習してください。
以上がRedis分散ロックとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。