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

推薦する

クラウド コンピューティング コンサルタント: 企業戦略について尋ねるべき 4 つの質問

アメリカの風刺コメディ『ザ・オフィス』では、架空のソフトウェア会社 Initech に雇われた 2 ...

大手企業がライブストリーミングを狙う:トラフィック獲得のためのゲーム!

ライブストリーミングは、結局のところトラフィックのゲームです。交通費補助金がなければ、羅永浩の2回目...

「SEOトレーニング」がわずか20日で百度ランキング1位に

昨日、私たちSEO担当者にとって最も衝撃的なことは何でしょうか?Robin(Liu Huanbin)...

優れたネットワークアライアンスプロモーションポジションを定義する方法

ウェブサイトを選択する際、人々は通常、ウェブサイトのトラフィック データ、広告スペースのサイズなど、...

Kubernetes を本番環境で 2 年間使用して学んだ教訓

約 2 年前、私たちは EC2 にアプリケーションをデプロイするための Ansible ベースの構成...

B2C Eコマースサイトの注文コンバージョン率の分析

一般的に、電子商取引にはインターネット、小売、サプライ チェーンの 3 つのアプローチがあります。コ...

WordPress ブログの購読者を増やす 5 つの方法

しかし、購読者がたくさんいても、記事にコメントする人が誰もいない場合は、カウントされません。そこで、...

奇妙なスナップショットのせいでサイトをキックオフしますか?ウェブマスターの皆さん、スナップショットについてよくご存知ですか?

多くのウェブマスターはスナップショットについて異なる感想を持っていると思います。百度の公式サイトはス...

xenspec: 月額 2 ドル、1Gbps の帯域幅、無制限のトラフィック、40G の防御、ロサンゼルス/シカゴ、kvm/1g のメモリ/1 コア/10g の SSD

Xenspec では、次の特典を提供しています: (1) シカゴとロサンゼルスでの VPS プロモー...

Google はどのようにコードレビューを行っていますか? コードレビューから何が得られますか?

この記事は海外雑誌IT Reviewより翻訳されたものです。原文リンクはこちら。私はもうGoogle...

劉強東の過去2年間のWeiboレビュー:「ビッグマウス」マーケティングに夢中

劉強東は8月15日、新浪微博の有名人影響力ランキングで1位になった。シナテクノロジー トレーシー20...

ウェブサイト運営を通じて成功顧客を忠実な顧客に変える方法

企業の売上を伸ばすために、多くの企業ウェブサイト運営者がさまざまなプロモーションチャネルを通じて企業...

sharktech - 50 ドル割引/デュアル チャネル L5520/24G メモリ/2x2T ハード ドライブ/5IP/1G 帯域幅

Sharktech Shark Data Center では、新しい安価なサーバーを販売しています。...

クラウドを超えた持続可能なコンピューティング

翻訳者 |トゥ・チェンイエ工業情報化部が「2022年中国コンピューティングパワー大会」で明らかにした...