Redisson 分散ロック ソースコード: 公平ロック キュー ロック

Redisson 分散ロック ソースコード: 公平ロック キュー ロック

[[408587]]

序文

前回の記事では、フェアロックのソースコードを分析し、次のような結論に達しました。

Redis ハッシュ データ構造: 現在のロックを格納します。 Redis キーはロック、ハッシュ フィールドはロック スレッド、ハッシュ値は再入回数です。

Redis リスト データ構造: スレッド待機キューとして機能します。新しい待機スレッドは、rpush コマンドを使用してキューの右側に配置されます。

Redis ソート セット オーダー セット データ構造: 待機中のスレッドの順序を格納し、スコアは待機中のスレッドのタイムアウト タイムスタンプとして使用されます。

ここで、スレッドがロックの失敗をどのように処理し、待機キューに配置されるかを見てみましょう。

1 ロック待ち

ソースコードエントリ: org.redisson.RedissonLock#lock(long, java.util.concurrent.TimeUnit, boolean)。

スレッドがキューに入った後、Java コードは while (true) ループ内で tryAcquire を呼び出し続け、ロックを取得しようとします。

最後に、RedissonFairLock#tryLockInnerAsync メソッドについて説明します。

便宜上、Lua スクリプトとスクリプト パラメータの意味を再度投稿します。

  1. KEYS[1]: ロック名、anyLock;
  2. KEYS[2]: ロック待機キュー、redisson_lock_queue:{anyLock};
  3. KEYS[3]: 待機キュー内のスレッドロック時間のセット、redisson_lock_timeout:{anyLock}。ロックタイムスタンプに従ってセットに格納されます。
  4. ARGV[1]: ロックタイムアウト30000
  5. ARGV[2]: UUID:スレッドIDの組み合わせ a3da2c83-b084-425c-a70f-5d9a08b37f31:1
  6. ARGV[3]: threadWaitTime デフォルト 300000
  7. ARGV[4]: currentTime 現在のタイムスタンプ

ソースコード分析

最初の部分、while ループ:

  1. 待機キューから最初の待機スレッドを取得します redisson_lock_queue:{anyLock};
  2. 待機スレッドのタイムアウト セット redisson_lock_timeout:{anyLock}; から最初の待機スレッドのスコアを取得します。
  3. タイムアウトがない場合はそのまま終了します。タイムアウトが発生した場合は、直接削除されます。

2 番目の部分では、現在のロックが存在するため、スキップします。

3 番目の部分では、現在のロックはスレッドによって保持されていないため、直接スキップされます。

パート4、

現在のロックの有効期限が切れる時間を直接返します。

現在の Redisson バージョンは 3.15.6 であり、バージョンによって若干異なります。

キューの並べ替え

公式はこれをバグだと思い、修正したため、ここでは並べ替えはありません。

詳細については、以下をお読みください: Justin Corpron 2019/5/10, 04:13 RedissonFairLock のタイムアウトドリフトを修正

最大の変更点は、4 番目のセクションが追加されたことです。

画像は 2 つのバージョンの違いのみを表しており、このバージョンが変更されたことを意味するものではありません。

2 まとめ

スレッドがロックの取得に失敗して待機キューに入ると、ttl != null となり、Java コードはロックの取得を試行し続けます。

ロックが存在せず、現在のスレッドが待機キューの先頭にある場合、ロックは直接取得されます。このキューイングプロセスは、フェアロックの撤回です。

この記事はWeChatの公開アカウント「Programmer Xiaohang」から転載したもので、以下のQRコードからフォローできます。この記事を転載する場合は、プログラマーXiaohangの公式アカウントまでご連絡ください。

<<:  FONEは2021年中国消費財業界CIOカンファレンスに参加し、ビジネスと金融のデジタル変革について議論しました。

>>:  スイスコムがクラウドネイティブ5Gネットワ​​ークへの移行を進める中、アマゾン ウェブ サービスが同社の優先パブリック クラウド プロバイダーに

推薦する

gogirdがクラウドホスティングを導入

GoGrid は、実際の制御機能を提供する世界で唯一のクラウド サービス プロバイダーであると主張し...

劉強東、大学生への性的暴行容疑でネットで暴露される:劉強東の逮捕写真が暴露されたが、王思聡は微博の投稿を削除したのか?

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

トレーニング ウェブサイト運用ガイド: ウェブサイトのアーキテクチャ

いわゆる研修サイトとは、研修情報を提供するウェブサイトのことであり、つまり、一定地域内の研修情報をイ...

クラウド支出の無駄を減らすために知っておくべきこと

多くの企業にとって、おそらく 2018 年に最も優先度の高い取り組みは、クラウド支出の最適化です。し...

素晴らしい: UBI 6 USD/月 1GB メモリ KVM/10GSSD/1TB トラフィック

今日、QQの友人から素晴らしいニュースを聞きました。UBIがONAPP環境をベースにした素晴らしい製...

ローカル業界のウェブサイト向け SEO に関するヒント

数え切れないほどの人々が、インターネットからより価値あるものをより良く、より速く掘り出すために集まっ...

abelohost-$49/E3-1220/4G メモリ/2X2T ハードディスク/G ポートは 100M に制限/オランダ

abelohost はオランダに登録されたホスティング会社で、KvK 番号は 57218153 です...

インプラントは手放すのがとても難しい。「兄はもういない」けれど、ブランドの記憶は残っている

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

Parallels Desktop 17 for Mac が新機能をリリース: Windows 11 と macOS Monterey 向けに最適化

[51CTO.com からのオリジナル記事] Parallels は最近、Apple M1 および ...

ウェブサイト運営者はどのようにしてウェブサイトを素早く診断できるのでしょうか?

ウェブサイトの運営で遭遇する問題は、誰にとっても最大の頭痛の種ですが、特に、ウェブサイトを最適化する...

オラクル、顧客のクラウドへの移行を加速させるOracle Support Rewardsプログラムを開始

Oracle Cloud Infrastructure に費やす 1 ドルごとに、Oracle テク...

2023 年の主要なクラウド コンピューティングとセキュリティのトレンド

研究機関は2023年に強い経済的逆風が吹くと予測しており、企業はより少ないリソースでより多くの成果を...

正直に言うと、SEO 業界はどれくらい奥が深いのでしょうか?

SEO は 1997 年に始まり、百度よりも古い 15 年以上の歴史があると一般に認識されています。...

ウェブサイトのキーワードを分析して選択する方法

ウェブサイトのキーワード選択の問題は、マーケティング ウェブサイトの構築において常に特に重要です。適...

体験の時代では、訪問者はもはや簡単に奴隷化されることはない

この記事の冒頭で、私は友人全員に尋ねたいのですが、現在の検索エンジンがどの世代の検索エンジン技術を使...