これまで、多くの人が分散ロックを手作業で書いているのを見てきました。実際、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 つの依存関係が必要です。
Spring Bootの基礎知識については紹介しません。よく知らない場合は、Java Technology Stack の公式アカウントをフォローして、background: boot に返信し、私が書いた過去の実践的なチュートリアルを読むことができます。 分散ロックの設定
使用例
RedisLockService は私がカプセル化した Redis ロック サービスです。コードがたくさんあるので、ここには掲載しません。完全なコード例は Github にありますので、スターを付けることができます: https://github.com/javastacks/spring-boot-best-practice テスト: http://localhost:8080/redis/lock?key=yeah 出力:
各スレッドは、ロックを取得する前に、前のスレッドが 3 秒間スリープするのを待機する必要があることがわかります。 ソースコード分析 統合が完了して使用できるようになった後も、RedisLockRegistry のソース コードをまだ調べる必要があります。そうしないと、落とし穴に遭遇した場合に別の記事に目を通す必要があります。 RedisLockRegistry には 2 つのクラス コンストラクターがあります。
したがって、expireAfter オプションを登録する必要があります。デフォルト値の 60 秒はビジネス ニーズを満たします。デフォルトの時間である 60 秒を超えると、ロックは失敗します。 RedisLockRegistry に関連する重要なメンバー変数が 2 つあります。
まず、現在の RedisLockRegistry インスタンス ID を識別するために使用され、ロックの設定と削除時に、それが現在のロック登録インスタンスであるかどうかを判断するために使用されます。
現在のロック登録インスタンスのすべてのロック オブジェクトをメモリにキャッシュするために使用されます。 ロックオブジェクトを取得する 以下に示すように、ロック オブジェクトのソース コードを取得します。 メモリ内の各キー (ConcurrentHashMap) はロック オブジェクトに対応します。ロック オブジェクトが生成されている場合は、それが直接返されます。そうでない場合は生成されて返されます。このロック オブジェクトを使用してのみ、ロックおよびロック解除操作を実行できます。 このロック オブジェクト (RedisLock) は、実際には Java の java.util.concurrent.locks.Lock ロック インターフェイスを実装します。 ロック オブジェクト (RedisLock) には、次の 2 つの非常に重要なメンバー変数もあります。
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%向上し、世界トップクラスのコンピューティングパワーを提供
最近、中国電信は天一クラウドネットワークポータル(www.ctyun.cn)と上海初の政府・企業オン...
2019 年 10 月 31 日、中国のエンタープライズ レベルの SaaS クラウド サービス プ...
SEO業界は基本的に白熱した段階に達しています。SEO最適化業界に従事する人の数は絶えず増加していま...
8月29日、360 Searchが16時30分頃に「安全でクリーン、かつ効果的に競争できるインターネ...
Directspace の Web サイトが刷新され、コンピューター ルームがアップグレードされまし...
「Observability Summit 2023」は、クラウドネイティブコミュニティが主催する技...
ソーシャル メディアと SEO には因果関係ではなく相関関係があります。現在、インターネット上では多...
SEO は検索エンジン最適化の略で、最適化手法を使用してウェブサイトを検索エンジンに好まれるようにし...
テンセントのWeChatは金融分野への参入の甘さを味わい、さらなる準備を始めた。最近、テンセント・ホ...
3 月 17 日より、raksmart はすべての VPS を 35% 割引で提供します。また、月額...
bgp.to の日本サーバーは、東京と大阪の 2 つのデータセンターにあります。異なるデータセンター...
実際にやってみるまで、APPを宣伝するさまざまな方法について聞いていました。お金をかけずにチャンネル...
内部リンクであろうと外部リンクであろうと、リンクを作成するときに最初に考慮する必要があるのはリンクの...
これらの Kubernetes 関連コンポーネントを活用して、監視、コマンドライン操作、マルチクラス...
losangelesvps は昨日、2 つの安価な VPS プロモーションを提供するメールを送信しま...