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

推薦する

月額20元で良い香港VPSを購入できますか?[更新]安価な香港VPSのおすすめ!

この記事の内容: 格安香港VPSサーバーのおすすめ!香港の物価が高いことは誰もが知っています。香港の...

Dockerコンテナのネイティブヘルスチェックメカニズムの詳細な説明

なぜヘルスチェックメカニズムが必要なのでしょうか?ヘルス チェック メカニズムは、サービスの可用性を...

joesdatacenter-Server$41/デュアルチャネル X5650/12g メモリ/1T ハードディスク/20T トラフィック/5IP

joesdatacenterは2008年からサーバー事業を展開しており、独自のカンザスデータセンター...

知らせ! 悪いレビューでブランドを台無しにしないようにしましょう

近年、「マーケティングを製品中心から消費者・顧客中心に転換する」という理論が、企業の意思決定者の間で...

4Kスマートテレビ市場への参入におけるLeTVの華麗な運営を詳細に分析

4Kスマートテレビ市場への参入におけるLeTVの華麗な運営を詳細に分析今日のインターネット時代におい...

分散一貫性に関する簡単な説明: Raft と SOFAJRaft

[[403519]] 1. 分散コンセンサスアルゴリズム1 分散コンセンサスをどう理解するか?複数の...

virmach 50%割引コード、この記事では定期的に更新されるvirmachの最も安いVPSを収集しています

この記事では、virmach の割引コードを収集し、それらをすべてリストして、誰もが virmach...

中小企業のウェブサイトのSEO最適化を行う際に注意すべきこと

SEO テクニックを習得し、SEO の考え方を柔軟に適用すると、SEO 最適化を自然にビジネスに取り...

HIROTEC が世界中の生産システムのリモート監視とリアルタイム監視に PTC の ThingWorx プラットフォームを採用

工場の可視化により、ダウンタイムの削減と生産効率の向上が期待できます。 PTC は最近、世界的に有名...

SEOの道を再び歩むと、世界は以前と同じではなくなる

2年前、家族のファームステイのウェブサイトのために、SEOについて何も知らない素人から、A5やSEO...

推奨: 3ix - シンガポール/香港/1 USD/月/データ無制限

学生の友人など、特にお金をあまりかけたくないけれど、サーバーが安定していて速度が遅すぎないことを特に...

Baidu のウェブサイト再設計ツールを使用して、7 日間で体重を完璧に移行します

6月26日午後、A5フォーラム(bbs.admin5.com)は正式に「A5トランザクション」に改名...

最近の百度ランキングの変動に平常心で対処する

最近、ウェブマスターフォーラムでも、ウェブマスターQQグループでも、Baiduランキングが一昨日はホ...

記事は楽しむことができますが、著作権は保持されなければなりません

長い間、皆さんとこの話題について議論したいと思っていましたが、話す価値がないといつも思っていましたし...