#Redis は、単一プロセス、単一スレッド モードであり、キュー モードを使用して同時アクセスをシリアル アクセスに変換し、複数のクライアントの接続間に競合がありません。レディス。
このコードで実装されるのは主に、特定のデータのシリアル番号をロックして、複数のスレッドがこのデータに書き込むのを防ぐことです。 (相互に排他的) (推奨学習: Redis ビデオ チュートリアル)
現在最も人気のある Redis 分散ロックは Redisson です。その基礎となる層を見てみましょう。 Redis が分散ロックをどのように使用するかを理解することです
原理分析
分散環境で分散ロックが解決する必要があるものは、並列ロック機能です。同じコードです; Redis 分散ロックについて学んだ人は、Redis が最初に setnx を分散ロックとして使用し、その後これに基づいてスケジュールされた有効期限を設定したことを知っているはずです。しかし、この方法にはどのような問題があるのでしょうか?
実際、上の図を理解できる人は、問題が何であるかを理解するでしょう。1 つ目はアトミック性の問題です。setnx 有効期限の 2 つの操作はアトミックである必要があるため、これは Lua スクリプトで解決できます
では、ロックを解除するタイミングはどうやって決めるのでしょうか?
有効期限をどれだけ長く設定しても、ロックされたコードがこの期間内に実行されるという保証はないため、この時間を設定するのは適切ではありません。実行が完了するとロックが解放される時間が決まっているわけではありません。問題は、マシンが実行の途中でクラッシュした場合、ロックは決して解放されないことです。
では、Redisson はどのように実行するのでしょうか。上記の問題は解決しますか?コードのカプセル化が簡素化され、使用方法が非常に簡単です。有効期限を積極的に設定する必要さえありません。
これは、10 秒ごとにウォッチドッグ watchdog を設計します。ロックがまだ保持されているかどうかを確認します。ロックが保持されている場合は、有効期限を 30 秒間更新します。この設計により、ロックを解放するまでロックを保持し続けることができます。ロックがダウンしている場合でも、自動的にロックを解除することができます。ロックを解放してもロックを取得できないクライアントは、ループ内でロックの取得を継続的に試行します。
ロックのクライアント ID を記録することで、リエントラント ロックとして設計できます。
以上がなぜ Redis は分散ロックを実行できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。