Spring Boot Redis は分散ロックを実装しているので、とても良いです! !

Spring Boot Redis は分散ロックを実装しているので、とても良いです! !

これまで、多くの人が分散ロックを手作業で書いているのを見てきました。実際、Spring Boot は今や十分な仕事をこなしています。すぐに使用でき、主流の Redis および Zookeeper ミドルウェアをサポートしています。 JDBC もサポートしています。

この記事では、Redis (最もよく使用されるソリューション) を例として、Spring Boot を使用して Redis を統合しキャッシュを実現する方法と、Redis 分散ロックを簡単かつ迅速に実装する方法を説明します。

分散ロックの概要

Spring Boot は spring-integration プロジェクトで Redis 分散ロックを実装します。以下を参照してください。

https://docs.spring.io/spring-integration/docs/5.3.1.RELEASE/reference/html/redis.html#redis-lock-registry

まず、LockRegistry ロック登録インターフェースのすべての実装クラスの構造図を見てみましょう。

DefaultLockRegistry は純粋なスタンドアロンの再入可能ロックであり、PassThruLockRegistry は空の実装クラスであり、どちらにも使用価値はありません。

Spring Integration 4.0 では、Redis ベースの分散ロック RedisLockRegistry が導入され、5.0 以降では、タイムアウトしたロックや無駄なロックを削除するために ExpirableLockRegistry インターフェースが実装されました。

分散ロックの実践

依存関係の追加

前述のように、Spring Boot は spring-integration プロジェクトで Redis 分散ロックを実装するため、次の 3 つの依存関係が必要です。

  • スプリングブートスターターデータRedis
  • スプリングブートスターターの統合
  • スプリング統合Redis
  1. <依存関係>    
  2. <グループID> org.springframework.boot</グループID>    
  3. <artifactId> spring- boot -starter- data - redis </artifactId>    
  4. </依存関係>    
  5. <依存関係>    
  6. <グループID> org.springframework.boot</グループID>    
  7. <artifactId> spring -boot-スターター-統合</artifactId>  
  8. </依存関係>    
  9. <依存関係>    
  10. <グループID> org.springframework.integration</グループID>    
  11. <artifactId> spring -統合- redis </artifactId>    
  12. </依存関係>  

Spring Bootの基礎知識については紹介しません。よく知らない場合は、Java Technology Stack の公式アカウントをフォローして、background: boot に返信し、私が書いた過去の実践的なチュートリアルを読むことができます。

分散ロックの設定

  1. @Bean(破棄メソッド= "破棄" )  
  2. パブリック RedisLockRegistry redisLockRegistry(RedisConnectionFactory redisConnectionFactory) {  
  3. 新しい RedisLockRegistry(redisConnectionFactory, "lock") を返します。  
  4. }

使用例

  1. @GetMapping("/redis/lock")  
  2. パブリック文字列ロック(@RequestParam("key") 文字列キー) {  
  3. (int i = 0 ; i <   10 ; i++) {  
  4. 新しいスレッド(() - > {  
  5. redisLockService.lock(キー);  
  6. 試す {  
  7. スレッドスリープ(3000L);  
  8. } キャッチ (InterruptedException e) {  
  9. e.printStackTrace();  
  10. }  
  11. System.out.println(DateFormatUtils.format(新しいDate(), "yyyy-MM-dd HH:mm:ss"));
  12. redisLockService.unlock(キー);  
  13. }
  14. )。始める();  
  15. }  
  16. 「OK」を返します。  
  17. }

RedisLockService は私がカプセル化した Redis ロック サービスです。コードがたくさんあるので、ここには掲載しません。完全なコード例は Github にありますので、スターを付けることができます:

https://github.com/javastacks/spring-boot-best-practice

テスト:

http://localhost:8080/redis/lock?key=yeah

出力:

  1. 2020-06-23 11:15:34  
  2. 2020-06-23 11:15:37  
  3. 2020-06-23 11:15:40  
  4. 2020-06-23 11:15:43  
  5. 2020-06-23 11:15:46  
  6. 2020-06-23 11:15:49  
  7. 2020-06-23 11:15:52  
  8. 2020-06-23 11:15:55
  9. 2020-06-23 11:15:58  
  10. 2020-06-23 11:16:01

各スレッドは、ロックを取得する前に、前のスレッドが 3 秒間スリープするのを待機する必要があることがわかります。

ソースコード分析

統合が完了して使用できるようになった後も、RedisLockRegistry のソース コードをまだ調べる必要があります。そうしないと、落とし穴に遭遇した場合に別の記事に目を通す必要があります。

RedisLockRegistry には 2 つのクラス コンストラクターがあります。

  • connectionFactory: Redis 接続ファクトリー
  • レジストリキー: ロックプレフィックス
  • expireAfter: 有効期限(オプション、デフォルトは60秒)

したがって、expireAfter オプションを登録する必要があります。デフォルト値の 60 秒はビジネス ニーズを満たします。デフォルトの時間である 60 秒を超えると、ロックは失敗します。

RedisLockRegistry に関連する重要なメンバー変数が 2 つあります。

  1. プライベート最終文字列clientId = UUID .randomUUID().toString();  
  2. プライベート最終マップ< String 、 RedisLock >  ロック=新しいConcurrentHashMap < > ();
  • クライアントID:

まず、現在の RedisLockRegistry インスタンス ID を識別するために使用され、ロックの設定と削除時に、それが現在のロック登録インスタンスであるかどうかを判断するために使用されます。

  • ロック:

現在のロック登録インスタンスのすべてのロック オブジェクトをメモリにキャッシュするために使用されます。

ロックオブジェクトを取得する

以下に示すように、ロック オブジェクトのソース コードを取得します。

メモリ内の各キー (ConcurrentHashMap) はロック オブジェクトに対応します。ロック オブジェクトが生成されている場合は、それが直接返されます。そうでない場合は生成されて返されます。このロック オブジェクトを使用してのみ、ロックおよびロック解除操作を実行できます。

このロック オブジェクト (RedisLock) は、実際には Java の java.util.concurrent.locks.Lock ロック インターフェイスを実装します。

ロック オブジェクト (RedisLock) には、次の 2 つの非常に重要なメンバー変数もあります。

  1. プライベート最終 ReentrantLock localLock = new ReentrantLock();  
  2. プライベート volatile long lockAt;
  • ローカルロック:

localLock はローカル メモリの再入可能ロックです。 Redis をロックする前に、まず localLock を使用してロックする必要があります。これにより、Redis へのロックの数を最小限に抑え、ロックのパフォーマンスを向上させることができます。

  • ロックされた日時:

ロック時に、期限切れのロックを削除するために使用されます。

ブロックロック

RedisLock#ロック():

ロックが正常に取得されるまで、100 ミリ秒ごとにロックの取得を試行します。割り込み例外は受け入れられません。その他の例外が発生した場合、ローカル ロックは解放され、例外が返され、プロセスは終了します。

主に、Redis ロックを設定する Lua スクリプトを見てみましょう。

キー: clientId に従って対応する値を照会します。現在のクライアント ID と一致する場合は、有効期限を延長します。 clientId が存在しない場合は、直接ロックします。上記のいずれも当てはまらない場合は、false を返します。

これの利点は、同時実行性とトランザクションの影響を考慮せずに、Redis Lua スクリプト全体をアトムとして実行できることです。

さて、コアソースコードの分析は終了しました。それは実はとても簡単です。それでもまだ理解できなかったり、興味があったりする場合は、さらに勉強することができます。

この記事の完全なサンプル ソース コードと、前の記事「Spring Boot Quick Integration Redis」のサンプル コードは Github にアップロードされています。スターとフォローへようこそ。

https://github.com/javastacks/spring-boot-best-practice

それで、まだ分散ロックを手作業で書いているのですか?今すぐ入手しましょう!

<<:  Alibaba Cloudが第3世代のShenlongクラウドサーバーをリリース:パフォーマンスが160%向上し、世界トップクラスのコンピューティングパワーを提供

>>:  クラウドネイティブ時代は Java か Go か?

推薦する

実際に自社サイトのランキング変動を分析。Baiduのアルゴリズム調整時に注目すべき要素

今朝、パソコンの電源を入れると、先週 Baidu が更新されていたことがわかりました。今日は、自分の...

顧客とユーザーは、両方を手に入れることができます

顧客とユーザー。百度百科事典の説明によると、ユーザーとは特定の技術、製品、サービスのユーザー、または...

#格安VPS業者#hostodoがAlipay決済のサポートを正式に発表

昨日のニュース: Hostodo は Alipay 決済に接続したことを発表しました。これにより、中...

モバイル広告プラットフォームのランキング - 適切なサードパーティを見つける方法

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますモバイル広...

イワシの中のナマズ 360度検索

世界で最も便利な検索エンジンは Google かもしれません。よく知られているいくつかの理由により、...

クラウドコンピューティングが普及した時代において、企業はどのようにして優れたクラウドサーバーを選択できるのでしょうか?

インターネット時代において、デジタル変革は新たな要件と新たなトレンドとなっています。企業は、変革を効...

最近のウェブサイトの掲載数の減少に関する仮説

2012 年は新しい年を迎え、SEO 担当者も活況を呈していました。時代の流れに合わせるために、百度...

権威の高い外部リンクを自ら掘り出す必要がある

現在、SEOでは、大量の外部リンクなどの危険な行為をしている人がまだ多くいます。彼らは、Baiduの...

Miyun監視ウェブサイト虚偽宣伝監視ウェブサイト違法行為

これまで、密雲県の企業が運営する商業ウェブサイト1,993件が電子商取引規制「レーダーネットワーク」...

フォーラムを使用して外部リンクを効果的に構築する方法

「コンテンツは王様、外部リンクは女王」という言葉は、すべてのウェブマスターが知っていると思います。こ...

Kubernetes PodでIPアドレスを取得する方法

Kubernetes ネットワーク モデルの主要な要件の 1 つは、各 Pod に独自の IP アド...

WordPress 3.5 がリリースされ、マルチメディア マネージャーが更新されました

WordPress は、セルフホスト型ブログおよび CMS プラットフォームのバージョン 3.5 を...

最近の考え:中規模・大規模ウェブサイトのコンテンツ構築について

短い考えを見ると、自然にいくつかの発散した考えや、最近感じたことの組み合わせなど、外部とのつながりが...

about.us が pokerbun と提携し、初年度登録無料を提供

現在、about.us はドメイン名再販業者の pokerbun と提携して、最初の 1 年間は米国...

今日、SEO はどのように効果を発揮できるのでしょうか?

Baidu の Green Radish Algorithm の登場以来、多くのウェブマスターが何度...