Redisson 分散ロック ソースコード 1: 再入可能ロック

Redisson 分散ロック ソースコード 1: 再入可能ロック

[[407548]]

序文

誰もが分散サービスを使用しているため、分散サービスでの同時データ更新の問題は避けられないと思います。

単一システムの場合、synchronize、ReentrantLock などのさまざまな Java ロックを考えるのは簡単ですが、分散システムではこれをどのように処理するのでしょうか。

もちろん、分散ロックを使用します。

分散ロックが何であるかわからない場合は、Shi Shan 教授の短期集中講座をご覧いただくか、オンラインで関連情報を検索することをお勧めします。

Redis を分散ロックとして使用する場合、最もよく使用されるフレームワークは Redisson です。

もちろん、Redisson はロックとしてだけでなく、他の多くの機能も備えています。公式ドキュメントをご覧になり、ご自身で実践してみてください。

Redisson関連のメモを記録し始めましょう!間違いがありましたら訂正してください。

1. 環境設定

  • ローカル環境に構築された疑似クラスター:

  • レディソン 3.15.6

バージョンによって異なる場合もありますが、中核となる考え方はそれほど変わりません。大きな変更がある場合はメッセージを残してください。

  1. <依存関係>
  2. <グループID>org.redisson</グループID>
  3. <artifactId>redisson</artifactId>
  4. <バージョン>3.15.6</バージョン>
  5. </依存関係>

  • プロジェクト準備

単純な Maven プロジェクトでは Main メソッドのみが必要です。

2. 再入可能ロック

lock.lock() ブレークポイントで、ソース コード エントリとして。

デフォルトではロックされており、パラメータは渡されません。しかし、ここではleaseTime = -1が設定されています。リースタイムの意味はロック時間です。

残りはただ前進するだけです。

tryAcquire メソッドを呼び出す前に、現在のスレッドの ID である long 型の正の数値である追加のパラメータ threadId が追加されます。

非同期ロック

tryAcquireAsync 非同期ロック メソッドに直接移動します。

取得非同期処理

先ほども述べたように、leaseTime は -1 なので、ここでは次の方法に進みます。

この時点で、いくつかのパラメータが明確になっています。

  1. 待機時間: -1;
  2. internalLockLeaseTime: デフォルトの時間 30000 ミリ秒を使用します。
  3. TimeUnit.MILLISECONDS: 単位はミリ秒です。
  4. threadId: スレッド ID;
  5. RedisCommands.EVAL_LONG:eval.

Redis eval コマンドのドキュメントは、https://redis.io/commands/eval で読むことができます。

ロックロジック

実際のロックは、まさにこのような Lua スクリプトです。

まず、lua スクリプトのパラメータ情報を説明します。

  1. KEYS[1]: getRawName()、anyLockなどのロックされたキー。
  2. ARGV[1]: unit.toMillis(leaseTime)、ロック時間(ミリ秒単位、例:30000)。
  3. ARGV[2]: getLockName(threadId)、これはUUIDとスレッドIDで構成される文字列です(例:931573de-903e-42fd-baa7-428ebb7eda80:1)。

Lua スクリプトを使用しているため、この Lua スクリプトのアトミック性が保証されます。

最初のロック分析:

  1. exists コマンドは、redis anyLock が存在するかどうかを判断します。
  2. 存在しない場合は、hincrby コマンドを使用して anyLock データを作成します。
  3. anyLock の有効期限を設定します。

ロック後の Redis のデータ形式は次のとおりです。

Redis のハッシュ データ構造の詳細については、https://redis.io/topics/data-types#hashes をご覧ください。

抽象的に言えば、anyLock は、その下にぶら下がっている KV 構造化データとして理解できます。

  1. 「anyLock」 : {
  2. "f400aad5-4b1f-4246-a81e-80c2717c3afb:1" : "1"  
  3. }

スクリプトを実行する

以降の内容は、Lua スクリプトの実行をリクエストする内容です。注意する必要があるのは、ハッシュ スロット ルーティングがあることだけです。

このコードは、NodeSource を取得するために CommandAsyncService#evalWriteAsync メソッドで呼び出されます。

もちろん、この NodeSource には 1 つのスロット (ハッシュ スロット値) のみが格納されます。

このスロット値は、ロックされたキーの CRC16 アルゴリズムを使用して計算されます。

  1. // MAX_SLOT のデフォルトは 16384 です
  2. int結果 = CRC16.crc16(キー.getBytes()) % MAX_SLOT;

スロットを計算することの用途は何ですか?

追跡を続けてください!

BaseRedisBatchExecutor#addBatchCommandData はソースからソルトを取得し、次に MasterSlaveEntry を取得します。

これは、この Redis キーに対応するノードを取得することであると大まかに理解できます。

再入性

再入可能ロックであるため、このブロックは再入可能性をサポートします。再入可能性がどのように保証されるかを見てみましょう。

  1. exists コマンドは、redis キー フィールドが存在するかどうかを判断します。
  2. 存在する場合は、hincrby コマンドを使用して、キー フィールドに対応する値を増分します。
  3. 現在の Redis キーの有効期限を設定します。

ロックミューテックス

上記では 2 つの状況が確認されています。

  1. redis キーが存在しません。
  2. Redis キーとキーのフィールドが存在します。

残りのケースは、キーは存在するがフィールドが存在しないときです。

キー フィールドには UUID:ThreadId が含まれていることに注意してください。これは、ロックされているスレッドが現在のスレッドではないことを意味します。このとき、現在のロックの残り時間がそのまま返されます。

3. まとめ

この記事では、主に Redisson 再入可能ロックのロック、ロック再入、およびロック相互排他ロジックについて説明します。

主な焦点は lua スクリプトにあります。 Redis のハッシュ データ構造も理解する必要があります。

また、ロック時間が指定されていない場合は、デフォルトは 30 秒になることに注意してください。

最後に、この記事のロックロジックを図で紹介します。

<<:  Longxingyoufengは、Beanオブジェクトの初期化と破棄のメソッドを実装するために仮想マシンにフックを登録します。

>>:  Tekton を使用した自動化パイプラインのリファクタリング

推薦する

エッジコンピューティングとクラウドコンピューティングの関係は何ですか?

IT の観点から見ると、パンデミックの期間中、リモートワーク、仮想コラボレーション、オンライン会議、...

教育業界におけるクラウドコンピューティングへの道

科学技術の発展により、伝統的な教育モデルは覆されました。学習の方法や場所、学習の構造や論理など、大き...

プロジェクトの本質は情報の非対称性であり、それがプロジェクトの成功の究極の鍵でもある。

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービス2018年の春節は少し異...

Dapu.com の創設者、王志全氏: 電子商取引の「速くて遅い」やり方

「Da Pu は有名になりたくない。」この言葉は、注目を集めるためにお金を燃やすことに頼っている現在...

K8s 拡張ワークロード OpenKruise CloneSet

OpenKruise (https://openkruise.io) は、デプロイメント、リリース、...

業界は有料音楽ダウンロードが今後も主流になるとは楽観視していない

ワーナーを含むいくつかの大手国際レコード会社が、今年末か来年初めにKugou、Kuwo、Baidu、...

クラウドコンピューティングにおける寡占競争は続く

クラウドコンピューティングの分野では、近年、Amazon、Microsoft、Google などのテ...

推奨する価値のあるクラウドコスト管理ツール 17 選

クラウド コンピューティング サービスへの支出を管理することは、これまで以上に重要になっています。ク...

Baidu Clickerからウェブサイトの直帰率がランキングに影響するかどうかを確認します

SEO ブラックハットといえば、最近登場した SEO 不正ツール、Baidu Clicker につい...

SFエクスプレスの生鮮食品eコマースの台頭から得た啓蒙:アルコール飲料はO2Oモデルに適している

双十一から20日近く経ちました。350億の取引高は、天猫にさらなるハイライトをもたらしたわけではなく...

三国志SEOシリーズ(I):茅葺き屋根の小屋を3回訪問

漢末期、黄巾の乱が勃発し、世は混乱に陥っていた。曹操が朝廷を掌握し、孫権は軍を率いて東呉に向かい、漢...

Qvodがサーバーをシャットダウンした理由を明らかに: 政府が「ポルノや違法出版物の取り締まり、インターネットの浄化」を実施しているため

さらに読む: Qvod のユーザーへの手紙: ビデオオンデマンドとダウンロードを停止するため、Qvo...

SEO で新しいドメイン名の組み込みをスピードアップする 6 つの方法

最近、Baidu は新しいウェブサイトのインデックス作成に苦労しています。新しいサイトがまったく含ま...

イベントマーケティングの視点からインターネットプロモーションを考える(原著)

現在、オンライン情報の発達により、各ウェブサイトでは毎日数十から数百の情報が更新されています。いくつ...