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 か?

推薦する

中国電信が天一クラウドポータルを立ち上げ、数百の業界に常時オンラインの政府・企業向けサービスを提供

最近、中国電信は天一クラウドネットワークポータル(www.ctyun.cn)と上海初の政府・企業オン...

Kingdee Cloud - Sky Serverless ERPが正式にリリースされ、企業顧客へのサービス向上に貢献

2019 年 10 月 31 日、中国のエンタープライズ レベルの SaaS クラウド サービス プ...

SEO担当者としては、最適化の前にウェブサイトの位置付けと計画に注意を払う必要があります。

SEO業界は基本的に白熱した段階に達しています。SEO最適化業界に従事する人の数は絶えず増加していま...

360 製品の脆弱性に関するニュースの真偽を明らかにする

8月29日、360 Searchが16時30分頃に「安全でクリーン、かつ効果的に競争できるインターネ...

directspace-$5/KVM/1g メモリ/40g SSD/2T トラフィック/10G ポート

Directspace の Web サイトが刷新され、コンピューター ルームがアップグレードされまし...

オブザーバビリティサミット2023登録開始

「Observability Summit 2023」は、クラウドネイティブコミュニティが主催する技...

ソーシャル メディアが B2B SEO に及ぼす 6 つの影響

ソーシャル メディアと SEO には因果関係ではなく相関関係があります。現在、インターネット上では多...

SEOオンサイト最適化の目的について

SEO は検索エンジン最適化の略で、最適化手法を使用してウェブサイトを検索エンジンに好まれるようにし...

テンセントホールディングスのWeChatは商業銀行の先駆者になるかもしれない

テンセントのWeChatは金融分野への参入の甘さを味わい、さらなる準備を始めた。最近、テンセント・ホ...

bgpto: 日本の東京データセンターにある独立サーバーの簡単な評価、実際のテストデータを共有

bgp.to の日本サーバーは、東京と大阪の 2 つのデータセンターにあります。異なるデータセンター...

APPプロモーションノート:100日間の無料/有料チャンネルプロモーションの概要

実際にやってみるまで、APPを宣伝するさまざまな方法について聞いていました。お金をかけずにチャンネル...

リンクや製品の推奨を行うときは、関連性だけでなく需要にも重点を置く必要があります。

内部リンクであろうと外部リンクであろうと、リンクを作成するときに最初に考慮する必要があるのはリンクの...

Kubernetes を使いやすくする 11 個のツール

これらの Kubernetes 関連コンポーネントを活用して、監視、コマンドライン操作、マルチクラス...

losangelesvps: ロサンゼルスで年間 25 ドルから利用できる KVM VPS、1Gbps の帯域幅、無制限のトラフィック

losangelesvps は昨日、2 つの安価な VPS プロモーションを提供するメールを送信しま...