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ネットワ​​ークへの移行を進める中、アマゾン ウェブ サービスが同社の優先パブリック クラウド プロバイダーに

推薦する

SAP、2022年第2四半期の業績を発表

• クラウド収益は34%と24%(固定為替レート)増加し、最大の収益源となった。 • 現在のクラウド...

shockhosting: 大容量の VPS ハードディスクを必要とするユーザーに適しています。$4.99、KVM/1g メモリ/150g ハードディスク/1T トラフィック

shockhosting は新たな動きを見せています。以前の「s」の何とも言えない「時代」型の VP...

農産物および副産物のインターネットマーケティングに関する簡単な分析

食料は国民の第一のニーズであり、農産物や副産物の生産は国民の日常生活と密接に関係しています。中国は伝...

トランプ氏が大勝利!アメリカ国民を集団的に異常な行動にさせるために、彼はどのようなブランドマーケティング手法を使ったのでしょうか?

先ほど、アメリカの最新選挙結果によりますと、トランプ氏がヒラリー氏を破り、見事にアメリカの新大統領に...

pumpcloud: マカオ VPS の再入荷、マカオ テレコム、500Mbps 帯域幅、超大規模トラフィック、市場では珍しい

マカオ VPS は VPS 市場で入手するのが非常に難しく、リソースが不足し、高価です。ここでは、p...

従来型企業が独立系B2Bモールを推進する際に直面する問題

前回の記事「伝統的な企業が独立系B2Bモールを構築する過程で遭遇する8つの大きな問題」が公開された後...

インフラストラクチャ・アズ・コードから環境・アズ・コードへの進化

GitOps を使用して環境を起動すると、一貫性、バージョン管理、速度など、開発チームに多くのメリッ...

エッジコンピューティングの導入を成功させるための 5 つの戦略

『フリンジ』は大いに話題になっているが、それには十分な理由がある。消費者も従業員も、より優れた信頼性...

2か月近く更新されていないウェブサイトの運命の観察例

今年6月に運営を始めたウェブサイトがあります。9月にはtoolz上のBaiduウェイトが4に達しまし...

Hostkvm: 香港の高帯域幅VPS(1Gbps帯域幅、モバイルCMI回線)の簡単な評価

Hostkvm は、香港国際ゾーン B に新しい VPS カテゴリを追加しました。実際、現在は中国移...

ウェブサイトの包含の削減を内部から科学的に分析

ウェブサイトのインクルージョンは、すべての基礎です。インクルージョンがなければ、何も語れませんので、...

広告収益化に関して、主要プラットフォームの中でどの動画戦略が最も優れているのでしょうか?

2018年は「動画」のトレンドも無視できません。主要プラットフォームはいずれも積極的な取り組みを行っ...

人気のドメインは1元から、AIギフトは40%オフ、百度スマートクラウドはダブル11に6つの主要なギフトを発売

スピードを上げるためにまだチームを結成中ですか?まだあなたを切り刻んでくれる人を探していますか?こう...

hostodo-$3.5/4IP/1g メモリ/50g ハードディスク/1T トラフィック/ロサンゼルス [無制限の VPS 作成]

これはHostodoの10月の第一波のプロモーションで、主に同社のクラウドVPSが大幅に割引されてい...

Webmaster Network からの毎日のレポート: Xiaomi が MSNLite を買収、Ctrip は同業他社に包囲されている模様

1. Nuomi.comの第2四半期の純営業利益は360万ドルで、前年同期比227%増となった。 8...