大手メーカーの Redis 分散ロックはすべてこのように設計されていることがわかりました。

大手メーカーの Redis 分散ロックはすべてこのように設計されていることがわかりました。

[[380081]]

1 ローカルロック

よく使用されるロックは、JDK の組み込みロックである synchronize または Lock です。これらは現在のプロセスのみをロックでき、モノリシック アーキテクチャ サービスにのみ適用されます。分散マルチサービス インスタンス シナリオでは、分散ロックを使用する必要があります。

2 分散ロック

2.1 分散ロックの原理

トイレピット理論

同時に 1 つの場所に移動して「ピットを占領」することができます。

  • 占有されている場合はロジックが実行されます
  • それ以外の場合はロックが解除されるまで待ちます

スピンで回転できる

Redis、DB、またはすべてのサービスがアクセスできる任意の場所に移動することで、「ピットを占有」できます。

2.2 分散ロックの進化

フェーズ1

  1. // 分散ロックを占有し、Redis を使用してロックを占有します
  2. ブール値 lock = redisTemplate.opsForValue().setIfAbsent( "lock" , "111" );
  3. if(ロック) {
  4. //ロック成功...業務実行
  5. Map<String, List<Catelog2Vo>> dataFromDb = getDataFromDb();
  6. redisテンプレート。 delete ( key : "lock" );// 削除
  7. dataF romDbを返します
  8. }それ以外{
  9. // ロックに失敗しました。もう一度お試しください。同期()
  10. // 100msスリープして再試行
  11. // スピン
  12. getCatalogJsonFromDbwithRedisLock()を返します
  13. }

問題のシナリオ

setnxはピットを占有しますが、ビジネスコードが異常であるか、実行中にプログラムがクラッシュします。つまり、ロック削除ロジックが正常に実行されず、デッドロックが発生します。

解決策: ロックが自動的に期限切れになるように設定し、削除されなくても自動的に削除されるようにします。

フェーズ2

  1. // 1. 分散ロックを占有し、Redis を使用してロックを占有する
  2. ブール型ロック = redisTemplate.opsForValue().setIfAbsent( "lock" , "110" )
  3. if(ロック) {
  4. // ロックに成功しました...ビジネスを実行
  5.    
  6. //突然の停電
  7.    
  8. // 2. 有効期限を設定する
  9. redisTemplate.expire( "lock" 、タイムアウト: 30、TimeUnit.SECONDS) ;
  10. Map<String, List<Catelog2Vo>> dataFromDb = getDataFromDb();
  11. //ロックを削除
  12. redisTemplate.delete (キー; "ロック" );
  13. dataFromDbを返します
  14. }それ以外{
  15. // ロックに失敗しました...もう一度お試しください。同期された()
  16. // 100msスリープして再試行
  17. //スピンモード
  18. getCatalogJsonF romDbWithRedisLock()を返します
  19. }

問題のシナリオ

setnxを設定した後、有効期限を設定しようとしましたが、クラッシュして再びデッドロックが発生しました

解決策: 有効期限とプレースホルダーの設定はアトミック操作である必要があります。 redisはsetNxExコマンドの使用をサポートしています

フェーズ3

  1. // 1. 分散ロックがピットを占有する
  2. ブール値 lock = redisTemplate.opsForValue().setIfAbsent( "lock" , "110" , 300, TimeUnit.SECONDS);
  3. if(ロック)(
  4. // ロックに成功しました。ビジネスを実行します
  5.    
  6. // 2. 有効期限の設定は、ロックと同時にアトミック操作として実行する必要があります。
  7. // redisテンプレート。期限切れ( "ロック" , з0, TimeUnit.SECONDS);
  8. Map<String, List<Catelog2Vo>> dataFromDb = getDataFromDb();
  9. // ロックを削除する
  10. redisTemplate.delete (キー: "lock" )
  11. dataFromDbを返します
  12. それ以外{
  13. // ロックに失敗しました。再試行してください
  14. // 100msスリープして再試行
  15. // スピン
  16. getCatalogJsonFromDbithRedislock()を返す
  17. }

フェーズ4

すでにロック値と UUID を取得しましたが、期限が切れています。他の人がロックを取得して新しい値を設定したため、if の後、他の人のロックが削除されました!!つまり、ロックの削除はアトミック操作ではありません。

  1. Map<String, List<Catelog2Vo>> dataFromDb = getDataFromDb();
  2. 文字列 lockValue = redisTemplate.opsForValue().get( "lock" );
  3. uuidがlockValueと等しい場合
  4. // 自分のロックを削除する
  5. redisTemplate.delete ( "ロック" ) ;
  6. }

問題のシナリオ

  • 現在の値が決定されている場合、ロックが削除されようとしているときに、ロックは期限切れになっており、他の誰かが新しい値を設定することに成功しています。削除されるのは他人のロックです
  • 解決

ロックを削除するには、アトミック性を確保する必要があります。 redis+Lua スクリプトを使用します。

ステージ5

ロック/ロック解除がアトミック操作であることを確認する

  1. 文字列スクリプト =
  2. 「redis.call( 'get' , KEYS[1]) == ARGV[1]の場合
  3. それから  redis.call( 'del' , KEYS[1])を返す
  4. それ以外  
  5. 0を返す
  6. 終わり";

ロック[プレースホルダー+有効期限]とロック削除[判断+削除]のアトミック性を確保します。さらに難しいのは、ロックの自動更新です。

要約する

実はもっと面倒なのが、ロックの自動更新です。そのため、大企業でも中小企業でも、これらの問題を解決するRedissonを直接選択します。私たちは車輪の再発明をしたくはありませんが、問題が発生した場合に迅速にトラブルシューティングして問題を特定できるように、フレームワークがどのような問題を解決するのかを知る必要もあります。

この記事はWeChatの公開アカウント「JavaEdge」から転載したものです。下のQRコードからフォローできます。この記事を転載する場合は、JavaEdge 公式アカウントまでご連絡ください。

<<:  「理解」エコシステムを構築し、エコシステムの潜在力を解き放ち、業界のデジタル変革に立ち向かう

>>:  エッジコンピューティングに関する誤解

推薦する

ハイブリッドクラウドと人工知能に賭けるIBMの分社化は成功できるか?

[[346377]]建国記念日を前に、NVIDIA による ARM 買収のニュースはテクノロジー界で...

分散システムのRedisマスタースレーブアーキテクチャ

単一の Redis サーバーは、数万から数十万の QPS を処理できます。キャッシュの場合、通常は読...

企業ウェブサイトの運営とプロモーションモデル:O2Oを選択することは後退となる可能性がある

インターネットで生き残りたいなら、インターネット思考が必要です。多くの企業ウェブサイトは、インターネ...

皆さんのために用意したBaiduアルゴリズムの仕組み

Baidu が更新されるたびに、誰もがため息をつくでしょう。「ねえ、なぜ私のランキングはまた下がった...

5G時代のもう一つの「爆発的な」アプリケーション、クラウドゲームの未来とは?

5Gは何ができるのか?これは、過去 2 年間、誰もが探求してきた質問です。 4月15日、百度はオンラ...

ウェブサイトが降格された場合、復活させるために次の5つのことを行ってください

ご存知のとおり、ウェブサイトの降格は多くのウェブマスターが経験したことがあるものです。降格の深刻な兆...

ガートナーは、2021年に世界のパブリッククラウド支出が18%増加すると予測している

ガートナーの予測によると、パブリッククラウドサービスに対する世界のエンドユーザーの支出は、2020年...

行き詰まったSEO実践者に捧げる

私はSEOERとして1年以上働いています。SEO実践者の未来はどこにあるのかとよく思います。SEO実...

Baidu の解読講座 1: Baidu 検索結果ページの URL パラメータの詳細説明

Baidu のホームページでキーワード検索を入力すると、検索結果ページにジャンプし、ブラウザの UR...

パブリッククラウドの導入によりSD-WANのメリットが増大

パブリック クラウドの導入の増加により、企業は SD-WAN の利点を活用する方法の調査を開始せざる...

RegVPS-$7/Windows/512 メモリ/15g ハードドライブ/1T トラフィック/ロシア/スイス/ドイツ/米国

RegVPSはロシア(2009年)に登録された会社です。現在、ロシア、スイス、ドイツ、米国の4つのデ...

hostyun による、日本大阪の AMD-IIJ シリーズ VPS (月額 20 元、500M 帯域幅) の簡単な評価

hostyun が最近日本の大阪で使用したサーバーは、ハイエンドの AMD プラットフォームを使用し...

A5マーケティングチーム:百度のグリーンキャロットアルゴリズムは警告であると同時にチャンスでもある

「百度を検索すればわかる」、かつては百度の主なプロモーションだったが、今では誰もが知る存在となり、数...

この記事では、人工知能がクラウドコンピューティングをどのように変え、私たちの生活にどのような影響を与えるかを説明します。

AIがクラウドコンピューティングをどう変えるかクラウド コンピューティングは、オンライン アクティビ...

Baiduインデックスの検索ボックスでサイトが見つからない問題を解決する方法

多くの人は、一定期間内に何らかのデータを生成する必要があるため、新しいサイトを最適化します。含まれる...