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

推薦する

王志全:Dapuはどのようにして良い製品を作っているのでしょうか?

【iTianxia.comからのお知らせ】Dapuはコストパフォーマンスに優れたインナーテキスタイル...

SEO に関するジョーク: トラフィック データを見てロングテール キーワードのレイアウトについて議論する

みなさんこんにちは。SEO に関する記事を書いてからしばらく経ちました。主な理由は、Baidu が最...

ガートナーのエッジコンピューティングの世界的競争状況:アリババクラウドとアマゾンが顧客に近いコンピューティングをリード

[[405672]]最近、権威あるコンサルティング会社ガートナーは、エッジコンピューティング分野にお...

権威あるリンクを判断する5つの基準

最近では、外部リンクを掲載するプラットフォームがますます少なくなり、高品質なコンテンツもますます少な...

Kubernetes を使いこなすのに役立つ 4 つのツール

このシリーズの 3 番目の記事「Kubernetes の基礎: まず方法を学ぶ」では、Kuberne...

IDC:2020年上半期のクラウド運用サービス市場規模は100.8億元

国際データコーポレーション(IDC)がこのほど発表した「中国クラウド運用サービス市場(2020年上半...

「Snowflake ID」のご紹介: 分散環境で大規模に一意の ID を生成するにはどうすればよいでしょうか?

[[334452]]画像ソース: unsplash一意の ID により、開発者はデータ オブジェクト...

ステーションBはゲームなしではやっていけない

4年前、ビリビリがナスダックに上場した当時、同社は「ゲーム会社」と定義されていた。ビリビリは確かにゲ...

Xiaomiのスマホが教えてくれた4つのこと

Xiaomi の携帯電話は、必ず話題になります。Xiaomi の携帯電話の研究開発、プロモーション、...

電子商取引金融の寒い冬:初期段階はこの冬を乗り切れなかった

Chuke 創業者兼 CEO の徐暁輝氏 (写真提供: Sina Technology)半年前、Ch...

Zhihu の収益化構造を分析: 大手 V は本当に儲かるのか?

最近、知乎はニューヨーク証券取引所で正式に鐘を鳴らした。周元氏はその場で、知乎の成長に付き添った優秀...

アジアのクラウドプロバイダーが暗号通貨マイニングマルウェアの標的に

アジアのクラウドコンピューティングサービスプロバイダーは現在、暗号通貨のマイニングに使用されるコンピ...

centralhosts-XEN (linux+windows)/1000M ポート/月間トラフィック 10T が 25% オフ

centralhosts.net は長い歴史を持つ IDC マーチャントであり、ドメイン名、仮想ホス...

モバイルインターネットの時代では、フォーラムもモバイルであるべきである

インターネットには、数え切れないほどのウェブマスターが夢を抱いていた時代がありました。地域性と専門性...

ウェブサイトのプロモーションで初心者が犯しがちな7つの間違い

最近では、インターネット業界への参入障壁が比較的低く、高度な教育や高度な技術を必要としないため、この...