Redisson 分散ロック ソースコード 10: 読み取り書き込みロック

Redisson 分散ロック ソースコード 10: 読み取り書き込みロック

[[409489]]

序文

Redisson は再入可能な読み取り/書き込みロックもサポートしており、分散シナリオで複数の読み取りロックと 1 つの書き込みロックを同時にロックできます。

1. 読み取り/書き込みロックを使用する

Redisson の読み取り/書き込みロックは JUC の下で ReadWriteLock を実装しており、その使用法は基本的に同じです。

2. ソースコード

ロックのソース コードは基本的に以前の再入可能ロックと同じですが、唯一の違いは Lua スクリプトにあります。

したがって、以下では Lua スクリプトの分析に焦点を当てます。

ロックのソースコードを読む

ソースコードアドレス: org.redisson.RedissonReadLock#tryLockInnerAsync

パラメータリスト:

  • KEYS[1]: ロック名 anyRWLock
  • KEYS[2]: ロックタイムアウトキー {ロック名}:UUID:ThreadId:rwlock_timeout、{anyRWLock}:e70b1307-9ddd-43de-ac9d-9c42b5c99a0d:1:rwlock_timeout
  • ARGV[1]: ロック時間、デフォルトは30秒
  • ARGV[2]: 現在のスレッド、UUID:ThreadId、e70b1307-9ddd-43de-ac9d-9c42b5c99a0d:1で構成される文字列
  • ARGV[3]: 書き込みロック名、getWriteLockName(threadId) 書き込みロック名、UUID:ThreadId:write、e70b1307-9ddd-43de-ac9d-9c42b5c99a0d:1:write で構成される文字列

最初の読み取りロック

  • ロックは存在しません。最初の部分に直接進んでください
  • anyRWLockのモードを読み取りに設定し、これが読み取りロックであることを示します。
  • ロック anyRWLock の e70b1307-9ddd-43de-ac9d-9c42b5c99a0d:1 (現在のスレッド) の値を 1 に設定します。
  • ロック {anyRWLock}:e70b1307-9ddd-43de-ac9d-9c42b5c99a0d:1:rwlock_timeout:1 を 1 に設定し、現在のスレッドの現在の再エントリのタイムアウトを示します。
  • 2つのRedisKeyの有効期限を設定する

読み取りロックの再入力

再入国の場合:

  • ロックは存在し、読み取りロックなので、2番目の部分に直接進みます。
  • anyRWLockのe70b1307-9ddd-43de-ac9d-9c42b5c99a0d:1(現在のスレッド)の値が1増加し、再入可能性を示します。
  • 2番目のロックのタイムアウトを示すために、{anyRWLock}:e70b1307-9ddd-43de-ac9d-9c42b5c99a0d:1:rwlock_timeout:2 を作成します。

読書サポート

  • ロックが存在する場合は、2番目の部分に進みます
  • 現在のスレッドの値を 1 増やします。これはすでに 2 番目のスレッドです。
  • 2 番目のスレッドのタイムアウトを設定します {anyRWLock}:7c390320-78e3-497f-a3d8-ac34a44d0464:48:rwlock_timeout:1

書き込みと読み取りの相互排除

読み取りロックが追加されました。このとき、書き込みロックが入ります。最初の部分と 2 番目の部分のどちらにも該当しないため、現在のロックの残り時間をそのまま返します。

次に、Java コードで while (true) spin wait を実行します。

上記のように、ロックを読み取るときは次のようになります。

  • anyRWLockロックはハッシュテーブル構造である
  • ロックする場合、ハッシュ テーブルにモード フィールドが設定され、ロックが読み取りロックか書き込みロックかが示されます。 mode = read は読み取りロックを示します。
  • ロック時に、現在のスレッド anyRWLock の UUID:ThreadId フィールドがハッシュ テーブルに設定され、その値は再入回数を示します。
  • ロックが追加されるたびに、ロックのタイムアウト期間を示す追加のキーが維持されます。このキーの構造は、{ロック名}:UUID:ThreadId:rwlock_timeout:再入回数です。

ロックソースコードを書く

ソースコードアドレス: org.redisson.RedissonWriteLock#tryLockInnerAsync

パラメータリスト:

  • KEYS[1]: 現在のロック anyRWLock
  • ARGV[1]: ロック時間、デフォルトは30秒
  • ARGV[2]: 書き込みロック名、UUID:ThreadId:write、c69a9ed4-5c30-4952-814e-c0b94ad03a7f:1:writeで構成される文字列

書き込みロックのソースコードは比較的理解しやすいです:

  • ロック モードを判別します。書き込みロックですか?
  • ロックが存在しない場合は作成する
  • ロックが存在するかどうかを判断し、それが自分である場合は再入力してください

このように、書き込み-書き込み相互排他性と読み取り-書き込み相互排他性が直接満たされ、現在のスレッドが再入できることがわかります。

3. まとめ

この時点で、読み取り/書き込みロックの読み取りは基本的に完了です。読み取りロックの実装はやや複雑ですが、書き込みロックは単純かつ明確です。

ロックを読み取るとき:

  • ロックanyRWLockはハッシュテーブル構造です
  • ロックする場合、ハッシュ テーブルにモード フィールドが設定され、ロックが読み取りロックか書き込みロックかが示されます。 mode = read は読み取りロックを示します。
  • ロック時に、現在のスレッド anyRWLock の UUID:ThreadId フィールドがハッシュ テーブルに設定され、その値は再入回数を示します。
  • ロックが追加されるたびに、ロックのタイムアウト期間を示す追加のキーが維持されます。このキーの構造は、{ロック名}:UUID:ThreadId:rwlock_timeout:再入回数です。

ロックを書き込む場合:

  • ロックanyRWLockはハッシュテーブル構造です
  • ロックする場合、ハッシュ テーブルにモード フィールドが設定され、ロックが読み取りロックか書き込みロックかが示されます。 mode = write は書き込みロックを示します。
  • anyRWLock では、再入回数を示すために追加のフィールド UUID:ThreadId:write が維持されます。
ウォッチドッグに関しては、これまでと同じなので、別途紹介はしません。この記事はWeChatの公開アカウント「Programmer Xiaohang」から転載したもので、以下のQRコードからフォローできます。この記事を転載する場合は、プログラマーXiaohangの公式アカウントまでご連絡ください。

<<:  中国電信がクラウドコンピューティングに投資し、天一クラウドテクノロジー株式会社を設立

>>:  Kubernetes 7周年記念:K8s の導入とアプリケーションの簡素化における VMware の成果と課題

推薦する

中国のトップ 10 検索エンジンについての簡単な説明 (パート 1)

現在、中国の検索エンジンは混乱状態にあります。百度、捜索、捜狗、有道、ヤフー、ビング、グーグル、そし...

AWS が 8 つのカテゴリで 22 の新機能をリリース

[元記事は51CTO.comより] 米国時間2017年11月29日、Amazonの子会社であるAWS...

ユーザーを維持するために、新しいサイトはどのように運営すべきでしょうか?

新しい Web サイトを構築する初期段階では、多くの Web 管理者にとって最大の懸念は、Web サ...

Qihoo 360、ZDNetにGoogleとの提携を確認

Qihoo 360、ZDNetにGoogleとの提携を確認ZDNetによると、Qihoo 360はZ...

武漢 SEO ブログ: ウェブサイトを再構築する際に既存のランキングを保護する方法

最近、武漢 SEO ブログは、パフォーマンスを向上させるためにウェブサイトを再構築してほしいという友...

contabo: オブジェクト ストレージを追加しました。シングル 250G~25T、20% オフ、最低 $2.49、トラフィック無制限

contabo は、19 年間運営されているドイツの老舗データセンターとして、多くの方にご存じのはず...

Soso Q&Aからのリンクが権限を伝達しない理由の簡単な分析

4日前、私は「Baidu ExperienceとSoso Wenwenのひどい外部リンクを暴露する」...

Baidu の大規模アップデートについて: 誤って削除されたウェブサイトの数

現在、百度は意識的にウェブサイトのランキングに手動で介入し始めています。これは私が以前の記事で述べた...

Virmach: ロサンゼルスの格安 Intel VPS のレビュー、販促品の実態をお知らせします

一昨日、Virmachは最新のスーパープロモーションを開始しました。3つの安価な米国VPSがあり、年...

CrownCloud: ロサンゼルスの QN データセンターの AMD RYZEN 9 5950X VPS、年間わずか 30 ドル

CrownCloud は非常に奇妙なビジネスです。比較的目立たず、あまり露出していませんが、長年運営...

4月25日の百度発表「外部リンク判定について」に対する私の意見

4月25日、百度ウェブマスタープラットフォームは「外部リンクの判断について」と題する記事を公開した。...

ウェブサイト最適化に関する FAQ 5: ウェブサイトのインデックス数が減少したのはなぜですか?

先ほど、SEO に関する 4 つの基本的な質問と回答について説明しました。 「新しいサイトが含まれな...

春節マーケティングを活性化させる6つの方法!

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービス春節が近づいてきました!...