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

推薦する

racknerd: 安価な米国クラスター サーバー、32C セグメント (511 IP)、月額 130 ドルから、Alipay/PayPal 決済

Racknerd は VPS 業界で非常に人気があるだけでなく、同社が提供する米国のクラスター サー...

清華紫光集団の「チップからクラウドへ」戦略は「デジタル中国」に中核技術サポートを提供する

2018年4月22日 - 福建省福州市の福州海峡国際会議展示センターで第1回デジタル中国建設成果サミ...

Orange VPS: cn2 gia vps、29元/月、512Mメモリ/20gハードディスク/500gトラフィック、「Netflix」を視聴できます

Orange VPS の cn2 gia ネットワークの VPS に、プロモーション用に 5 つの新...

世界のリーダーたちの意見を解釈し、2019年のクラウドコンピューティングの新たな変化を考察する

クラウド コンピューティングは過去 1 年間で劇的に変化しました。 Kubernetes の導入は業...

burstNet-E6500/4g メモリ/500g ハードディスク/5T トラフィック/フリー DA パネル

BurstNet は、デフォルトで 5T のデータ トラフィックを備えた特別価格のモデルを 2 つリ...

ポータルサイトが二級都市、三級都市に定着し、繁栄することが難しいのはなぜでしょうか?

地方ポータルは、特に二級都市、三級都市の草の根ウェブマスターの運営において常に弱点となってきました。...

美団と大衆点評の協力の主な問題

美団と大衆点評の合併は中国インターネット業界で大きな注目を集めている。両者の新会社の評価額は150億...

Qvodはロングテール問題を解決し、中小規模の動画ウェブサイトに無料の技術サポートを提供します

多数の中小規模のビデオ Web サイトに無料の技術サポートを提供することで、深セン Qvod テクノ...

パンデミックの間、クラウドデスクトップにより、対面会議を伴わない政府業務を機密に保ち、スケジュールすることが可能になった。

「クラウドデスクトップを通じて、これまでは機密保持の要件によりインターネット上では知ることのできなか...

hostus-KVM VPS 50% オフ/512MB メモリ/月額 3 ドル

Hostus は 2009 年に設立され、3 名で構成されています。サーバーは、Intel E3-1...

ゴン・ハイヤンの引退の裏側:伝統的な出会い系サイトモデルがボトルネックに遭遇

ゴン・ハイヤンテンセントテクノロジー胡向報が12月26日に報じた。 2012年12月24日の夜、北京...

ハロウィン: hostslayer-2.5 USD/2.5 GB RAM/35 GB HDD/1.5 TB Flow/ニュージャージー

Hostslayer.com は、ハロウィーン前にハロウィーン プロモーションを開始しました。Ope...

百度、新ホームページ開設1周年のデータを発表:累計ユーザー数1億2000万人

9月3日午後、Baidu World 2012カンファレンスで公開されたデータによると、Baiduは...

マイクロソフト、Bingショッピング検索を促進するために反グーグルウェブサイトScroogledを立ち上げ

クリスマスが近づくにつれ、米国ではショッピングシーズンが始まり、Google ショッピング検索にもす...

Google+のコンテンツがGoogle検索に表示され始める

Google の検索結果は常にパーソナライズされています。Google アカウントにログインしていな...