大手メーカーの 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 公式アカウントまでご連絡ください。

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

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

推薦する

将来に影響を与える戦略的テクノロジートレンドトップ10

常に進化するテクノロジーの世界では、企業、政府、個人にとって、常に最先端を行くことが重要です。このダ...

マルチクラウドは本当に価値があるのでしょうか?

マルチクラウド導入への関心が高まっていますが、対処すべきビジネスやワークロードが非常に多いため、ほと...

なぜ 360 は Baidu に接近し、頻繁にアルゴリズムを更新しているのでしょうか?

最近、Baiduは頻繁にアップデートを行っています。Baidu Webmaster Platform...

NodeServ -21% オフ/フロリダ/G ポート

構成は、デュアル L5520、36 GB RAM、4x1TB ドライブ、RAID 10 です。データ...

百度へ

このタイトルを思いついたとき、私はまだウェブサイトの宣伝に取り組んでいました。しかし、時代は変わり、...

テンセント、フィッシングサイトとしてQQの大規模データ漏洩に反応

大規模なQQデータ漏洩により、パスワードや友達サークルなどの個人情報を閲覧できる可能性があると報告さ...

エンタープライズデジタルトランスフォーメーションからクラウドネイティブソリューションまで

クラウドネイティブへのデジタルトランスフォーメーションの概要今日は、エンタープライズのデジタル化とク...

verelox-2.29 ユーロ/VPS/カスタム ISO/Windows/無制限トラフィック/KVM/無料 DDoS 保護

verelox.com は、オランダのハーグに設立されたホスティング会社で、VPS、サーバーレンタル...

フォーラム、ビデオサイト、QQグループを通じて正確な顧客データベースを取得する方法

私はいくつかの高収益商品を運営しており、1回の取引の利益は400元近くに達することもあります。顧客デ...

ソフト商品のプロモーションは、ほとんどの企業にとって欠かせないマーケティングツールです。

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますどれだけ優...

DataCanvas が Gartner Cool Vendors に選出

最近、世界的に権威のあるITコンサルティングおよびリサーチ会社であるガートナーは、デジタルファイナン...

現在の外部リンクの品質を向上させる方法

インターネットプロモーションは現在一般的なマーケティング手法です。それが達成できる有効性は明らかです...

A5 Webmaster Networkのセカンドサーバーウェブサイトセキュリティトレーニングの申し込み受付を開始しました

サーバー Web サイト セキュリティ トレーニングに参加する必要があるのはなぜですか?最新の統計に...

大手企業がライブストリーミングを狙う:トラフィック獲得のためのゲーム!

ライブストリーミングは、結局のところトラフィックのゲームです。交通費補助金がなければ、羅永浩の2回目...