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

推薦する

ZStack のクラウド コンピューティングへの道のり: 最先端技術の絶え間ない出現と絶え間ない製品化

[51CTO.com オリジナル記事] 2015 年に設立された ZStack は、3 年間の開発期...

不安定なウェブサイトランキングの解決策について詳しく議論する

不安定なウェブサイトランキングの解決策について詳しく議論する今日は、ウェブサイトのランキングが不安定...

Linode Windows VM への「ローカル」アクセスを取得する方法

ほとんどの場合、 IT の運用と保守作業はリモートで実行できます。管理対象システムにネットワーク経由...

ハイブリッドクラウドが開花し、実を結び、クラウドコンピューティングの新時代を先導する

ケニー・マリカン氏にとって、ハイブリッド クラウドを使用するという決定は当然の結論でした。 「独自の...

Linuxシステムにおける仮想デバイスファイルのさまざまな実用的使用法

[[332331]]みなさんこんにちは。私は梁旭です。ご存知のとおり、Linux ではデバイス ファ...

温かみのあるテクノロジーがデジタル中国の未来を描く、景東が清明節にアリペイ版「河畔」を披露

9月20日、技術専門家が集まったATECメインフォーラムで、何千年もの間旅をしてきた古代の絵画が「生...

virpus - シアトルの Xen 仮想 VPS、40% オフ、更新時の価格上昇なし、512 RAM が年間 20 ドルから

11年間運営してきたVirpusが、年末に生涯40%割引プロモーションを実施しました。SSDハードド...

Hujiang.com の教育方法: オンライン スクールはビデオだけではない

文 | CBN記者 ゾウ・トン、インターン記者 ソン・ジン3年前、Hujiang.comの創設者であ...

コレクションEコマースサイトの運営における4つの課題を分析

電子商取引は以前ほど利益が出ないとはいえ、コレクター向け電子商取引の収益性は依然としてかなり良好で、...

V.PSはどうですか? 1Gbpsの高帯域幅香港VPSを評価、3つのネットワークを香港CMI経由に強制、速度が保証される

v.psはどうですか? v.ps 香港はどうですか? v.psは香港にデータセンターを持ち、香港クラ...

ウェブマスターネットワークニュース:電子商取引が生鮮食品市場に参入、アリランが「クラウドキャット」を発売

1. 電子商取引が「コールドチェーン」の欠点を補うために生鮮食品市場に参入電子商取引は「コールドチェ...

7月12日の百度の調整結果に関する詳細な分析と提案

十数個のウェブサイトのデータを数え終えたところです。今朝目覚めると、手元にある十数個のウェブサイトが...

「ラブアンドプロデューサー」の広告は、革新的なマーケティングとオンラインとオフラインの連携を生み出し、ブランドを強化します。

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

現代の製造業におけるクラウドコンピューティングベースのテクノロジーの重要性

デジタル化はすべての人に影響を及ぼし、企業にとって大きな可能性と課題を生み出します。ほぼすべての業界...

flokinet、アイスランド VPS/アイスランド サーバー、高度なプライバシー保護、1Gbps 帯域幅、1Tbps の高度な防御を内蔵

アイスランドのサーバー業者 flokinet (~) は、アイスランドのデータセンターでアイスランド...