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

推薦する

98Cloud: プレミアムラインVPS、21元から、香港CN2/米国トリプルネットワークAS9929(アウトバウンド200G高防御)

九巴クラウドは2009年に設立され、主に香港CN2 GIA VPS(発信:中国電信+中国聯通経由CN...

コンテナ テクノロジーと K8S の次の目的地はどこでしょうか?

コンテナが将来どこに向かっているのか全体像を把握したいのであれば、資金の流れを追跡し、どこに投資され...

profvds: スロバキア VPS、メール用にポート 25 を開放、トラフィック制限なしの 1Gbps 帯域幅、月額 10 ユーロ、3G RAM/1 コア/20g ハード ドライブ

profvds は現在、主にスロバキアの VPS サービスを提供しています。デフォルトでは、ポート ...

LBXU: 米国の高防御 CN2 回線向けの無料 10G DDos 保護、月額 6 ドルから、トラフィック無制限

LBXU(Lobo Data)は現在、年末プロモーションを開始しています。公式ニュースによると、新し...

フォーラムやブログの外部リンクがウェブサイトのランキングにまだ役立つかどうかの簡単な分析

ご存知のとおり、フォーラム ブログの外部リンクは、外部リンク リソースが不足している多くの Web ...

マイクロソフトがWindows 10オペレーティングシステムをリリース

10月1日、マイクロソフトはサンフランシスコでの記者会見で次世代のWindowsオペレーティングシス...

再入荷: virmach-128M メモリ VPS は年間 4 ドルから

virmach.comの特売品が再入荷しました(発売後しばらくは品切れとなります)。お買い得品好きの...

新しいウェブマスターがウェブサイトを構築するときに触れてはいけない4つの禁断の領域

新しい環境に住むときはいつでも、地元の習慣、特に一部の少数民族の習慣を理解する必要があります。少数民...

シンプルで習得しやすいソフトコピーマーケティングスキルとは?この5つのステップを見てください

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービス私は企業のプロダクトマー...

Kubernetes でのゼロトラストの実装

この記事は、ContainerJournalの2022年の記事「Kubernetesでのゼロトラスト...

工業情報化部:無線インターネット接続にも実名登録が必要

【はじめに】 これまでも固定電話においては実名登録が実施されてきましたが、無線インターネット接続カー...

WeChat が入力方法を開発する必要があるのはなぜですか?

張小龍が公開授業のスピーチで言及した5つの実験プロジェクトのほとんどは、WeChatバージョン8.0...

クラウドネイティブのビッグデータ知識マップを1つの記事で学ぶ

1. 一般的な傾向: クラウドネイティブのビッグデータ業界の急速な発展とビジネスの高速反復により、デ...

最近の百度検索における2つの不可解な点を詳しく見る

現在、中国でインターネットをサーフィンする場合、Baidu は基本的に欠かせないものとなっているため...

工業情報化省は少なくとも6つの仮想オペレーターライセンスを発行した。

現在、「移動通信再販事業試行計画(意見募集案)」がインターネット上で意見募集されており、我が国の仮想...