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

推薦する

すべてのSEO担当者が外部リンク構築のルールを知っているわけではない

ウェブサイトのランキングでは、過去に投稿した外部リンクがすべてランキングに影響を与えるわけではありま...

福建省通信管理局は226の違法・不法ウェブサイトを閉鎖し、78,900件の登録情報を抹消した。

今年初めから、福建省通信局はインターネット産業の主管部門としての職責を効率的に遂行し、インターネット...

Google、人工的なランキングブーストに対抗するためウェブサイトランキングアルゴリズムを調整

北京時間5月17​​日、海外メディアの報道によると、Googleは最近、検索エンジンのウェブサイトラ...

クラウドコンピューティングとブロックチェーンが出会うと、どのようなエネルギーと火花が生まれるのでしょうか?

最近、「Google がクラウド コンピューティング ブロックチェーン製品をリリースしようとしている...

6月28日の百度Kステーション後の迅速な回復方法の分析

6月28日のBaiduの大規模Kサイト以来、草の根ウェブマスターの怒りと抵抗に加えて、最も注目されて...

百度の右プロモーション位置から左に移動してみましょう

数日前、友人が百度の右側昇格位置の変化について話しているのを聞きました。後で調べたところ、百度の右側...

pq.hostingはどうですか?ポルトガルのリスボンにあるポルトガル VPS の簡単なレビュー

pq.hosting は、ポルトガルのリスボン データ センターで、ポルトガル VPS およびポルト...

VPSCreed - 完全管理型 KVM/永久 35% オフ/512M - 月額 5.59 ドル

vpscreed.com は 2017 年に設立されたインドの VPS 販売業者です。現時点では、詳...

SalesEasy CRM: SaaS 企業がスケールアップするための中核となる 5 つの重要なステップ

2020年は中国のSaaS企業にとってチャンスと課題に満ちた年です。 企業のデジタル意識の深まりと、...

クラウドコンピューティングの PAAS と SAAS の違いを 1 つの記事で理解する

クラウド コンピューティングが非常に普及している今日、クラウド ホストをレンタルするだけでクラウド ...

xhostfire-7USD/KT/KVM/384MB RAM/10GB SSD/1000MB ポート

xhostfire.com は、KVM、純粋な SSD (raid10)、solusvm パネル、1...

SEO初心者: ウェブマスターが毎日やるべきこと

ウェブマスターの皆さん(追伸:特に新しいウェブマスターの皆さん)、皆さんが毎日何をしているのか知りた...

HiChinaとSina Weiboが共同でマイクロブログコンテンツ自動生成ウェブサイトを立ち上げ

ウェブマスターネットワークが6月12日に伝えたところによると、HiChina、新浪微博、CNNICは...

コンテンツの再パッケージ化により、ウェブサイトのコンテンツがより目立つようになります

コンテンツの再パッケージ化は、最も強力なコンテンツ マーケティング戦略の 1 つです。この用語はあま...