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

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

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

推薦する

入札者、SEM スーパーバイザー、プロジェクト マネージャー、あなたはどのカテゴリに該当しますか?

本日執筆した記事は、プロジェクト マネージャーや SEM スーパーバイザーの観点から、入札の「遊び」...

2019年モバイルアプリケーショントレンドレポート!

世界のアプリ経済は急成長期にあります。App Annie によると、アプリストアでの消費者支出は 2...

実践分析:ウェブサイト上の内部リンクの重要性

ウェブサイトのコンテンツや外部リンクの重要性は誰もが知っていますが、多くのウェブマスターは内部リンク...

自己を見つめる質問:繰り返し消費、注文消費、分散取引

[[429685]]こんにちは、みんな私はあなたの学習と成長のパートナーですキャプテンRocketM...

#ウェブサイトの推奨事項# liquidweb: cPanel または Plesk 認証による完全管理の新しい VPS シリーズ

世界的に有名な完全管理型ホスティング プロバイダー Liquidweb は本日、引き続き完全管理型で...

「産業+起業」がデュアルチャネルを強化、ファーウェイクラウド衛光トレーニング成都ステーションがオープン

4月26日から27日にかけて、ファーウェイクラウドスタートアップサポートプログラム成都ステーションW...

5月2日の百度アルゴリズム調整のまとめと分析、SEOの今後の動向

少し前、いくつかのプラットフォームで多くの友人が次のような問題について不満を漏らしているのを見ました...

Webmaster.com の日刊レポート: 共同購入ウェブサイトが 2919 に減少; iPad mini が発売

中国の共同購入サイトの数は2,919に減少し、毎日5.9サイトが消滅している。昨日、共同購入ナビゲー...

大手企業がしのぎを削るクラウドコンピューティング市場で、中小企業はいかにシェアしていくのか。

「クラウド コンピューティングが、5 人の若い有名人の結婚と、Weibo での 4 人の有名人の浮気...

プライベートクラウドプラットフォームは絶滅の危機から脱しつつある

企業は、パブリック クラウドを採用するか、プライベート クラウドを採用するかという選択に直面すること...

「共同購入の生き残り」王興氏:最悪の時こそ正しいことをする

今年1月、美団は本社を北京望京国際研究開発パークに移転した。南北2棟からなる4階建ての連結ビルでは、...

SEOの考え方:前進しなければ遅れをとることになる

最近、福建省のSEOについて考えています。以前、自分自身に学ぶ機会を与えるだけでは感情的に十分ではな...

ウェブサイトの趣: Huxiu.com の成功を 5 つの側面から簡単に説明します

私は今年、新しく立ち上げられ、慎重に管理されているウェブサイトのいくつかをフォローして観察し、他の人...

企業ウェブサイトの降格に影響を与える4つの主な要因の簡単な分析

一般的に、中小企業のウェブサイト所有者は、最初はあまり気にしていませんでした。彼らは自分の企業がより...