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 を使用した自動化パイプラインのリファクタリング

推薦する

ビッグデータ分析とクラウドテクノロジーが融合した場合、どのように連携できるのでしょうか?

データの出現により、ビジネス インテリジェンスは真に 21 世紀に移行しました。しかし実際には、「ビ...

「コンテナ技術」についての興味深い講演。彼女がその素晴らしい話をあなたに話すように頼んできました!

簡単に大きな行動に出てしまう可能性のある彼女を前に、私は表面上は彼女を喜ばせようとしながらも、心の中...

limewave: シアトル VPS、年間 12.96 ドル、1G メモリ/1 コア/15g SSD/3T トラフィック

Limewave は現在フラッシュセール プロモーションを実施しており、シアトル データ センターの...

ウェブサイトの最適化に関する簡単な説明:SEOランキングは核心的なポイントを把握する必要がある

みなさんこんにちは。最近何かが起こり、忙しくてオンラインになっていなかったので、記事をシェアしていま...

申請不要のホストとクラウドホスト

登録不要のホスト、登録不要のクラウドホスト:登録不要のホスト(登録不要のクラウドホスト)は、香港、台...

巨人の到来により、星生有軒に残された時間は多くない。

コミュニティ共同購入は、少し前にとても人気がありました。多くの商人や大手企業が野菜ビジネスに参入した...

小紅書は密かに海外へ出向く

毎日2時間以上「小紅書」(「小紅書」ユーザーの別名)を利用するヘビーユーザーとして、ここ数ヶ月、香港...

インターネット企業はどのようにして安全で信頼性の高いクラウド データ ストレージを構築するのでしょうか?

クラウドコンピューティングは急速な発展段階に入りました。パブリック クラウド テクノロジーとビジネス...

おすすめ: host1plus - 25% オフ/5 台のコンピュータ ルーム/完全にアップグレードされた構成/Alipay による支払い

明けましておめでとうございます!今日は仕事初日です。皆さんがよい仕事に就き、たくさん稼げるよう祈って...

Argo CD を使用して GitOps パイプラインを変換する

Argo CD は、宣言型 GitOps コンセプトに従う Kubernetes の継続的デプロイメ...

Ruoyuの中国ウェブサイトが調査され処罰される; Shanda Literatureが再び海賊版ウェブサイトと戦う

最近、国内で有名な著作権侵害・海賊版サイト「Ruoyu Chinese Network」が捜査を受け...

今日の見出し: カラークロッシングがシカゴゴブスを買収

Chicagovpsからメールが届きました:9月8日、有名なデータセンターColorcrossing...

WeChatのパブリックプラットフォームポリシーは不明確で、多数の草の根WeChatアカウントがブロックされている

私は昨年8月20日に正式にWeChatパブリックプラットフォームを使い始めました。当時、パブリックプ...

ビッグデータがインターネットに与える影響

ビッグデータは、最近インターネット大手が頻繁に言及する用語です。ビッグデータは徐々にインターネットを...