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 の成果と課題

推薦する

クラウドを維持するか、クラウドに移行するか?それが問題だ

過去 1 年ほど、パブリックとプライベートの両方において、クラウド コンピューティングに関する話題が...

eLong のターンアラウンドのケーススタディ: 企業の位置付けがどのようにして発展への道を阻んでいるのか?

eLong は確かに天井に達しました。 eLongの2013年の財務報告は芳しいものではなかった。収...

Docker をさらに強力にする 12 個のオープンソース ツール

[51CTO.com クイック翻訳] 現在、Docker 分野の発展は日々変化しています。 Kube...

SEO で結果がいつも出ない?ここにあなたが欲しいヒントがあります

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますSEO 最...

オンラインプロモーション:市場での入札「成功か失敗かは小和にかかっている」

近年、オンラインプロモーションをいち早く取り入れた中小企業が、その恩恵を享受しています。世の中には予...

ゴールドディガーブログの最適化と修正手順に関する個人的な意見の共有

Gold Diggerがウェブサイトを構築してからこの記事を書いている時点では1年1ヶ月以上が経過し...

建国記念日の休暇中の「行列、混雑、人混み」からオンラインプロモーションに対する姿勢についてお話ししましょう

国慶節の連休から戻り、厳しい帰国の試練を乗り越えた後、チケットを買うための行列、高速道路の交通渋滞、...

初心者のためのクラウドコンピューティング入門

2006 年 8 月 9 日、当時 Google の CEO であった Eric Sc​​hmidt...

電子商取引企業がオンラインメディアを利用して無料マーケティングを実施するための完全ガイド

インターネット時代において、オンラインマーケティングの本質は低コストと高効率です。オンラインメディア...

U-Mailが成功するメールマーケティングタイトルの4つのタイプを明らかにする

月収10万元の起業の夢を実現するミニプログラム起業支援プラン「始めが良ければ終わりも半分。」電子メー...

VM、ホスト、Kubernetes、クラウドサービスを保護する

実行時にアクティブなパッケージに焦点を当てることで、重要なものを優先します。 第 48 回 IT プ...

トラフィックキャッチャー: SEO キーワード最適化

優れた Web サイトを構築するには、キーワードがトラフィックを獲得するための重要な手段であることは...

ウェブサイトの品質を判断する方法

SEO業界では、自社、競合他社、さらには業界のウェブサイトに対してSEO分析を行い、より多くのデータ...

セレブのライブストリーミング再編

有名なキャスターがまた失敗した。 12月24日、アップストリームニュースによると、陳暁春のあるマッサ...