これまで、多くの人が分散ロックを手作業で書いているのを見てきました。実際、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%向上し、世界トップクラスのコンピューティングパワーを提供
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています企業がウェ...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますご存知のよ...
2009 年にインターネットに触れて以来、インターネット業界で働く友人や先生から「コンテンツこそが王...
4年に一度のワールドカップが近づいています。ワールドカップのたびに、多くのブランドが実際の資金でワー...
みなさんこんにちは。私は次男です。なぜこの号でこのトピックについて書くのでしょうか? K8s には非...
本稿では、計画策定と実践ポイントという2つの側面から活動全体の重要な詳細を分析・紹介し、パブリックア...
本から学ぶことは常に表面的なものです。本当に理解するには、自分で実践しなければなりません。この記事は...
競争があってこそ、より大きな進歩が実現します。国を外界から隔離する政策は、もはや社会の発展には適して...
多くのウェブマスターは、民間医療業界における短い単語を懸念しています。なぜなら、多くの短い単語を思い...
[51CTO.com クイック翻訳] 2年前、インテルはFPGAチップメーカーのアルテラを買収するた...
かつて、周洪義という偉大な人物が、ユーザー エクスペリエンスに関する独自の見解を次のように表現しまし...
部外者にとって、SEO は何年も変わっていないように見えます。近年、なぜ SEO のコストがどんどん...
エッジ コンピューティングとは、オープン プラットフォームを使用してデータ ソースのすぐ近くに最も近...
最近、Weiboでは国慶節の混雑についてさまざまな苦情や傍観者がいる。コロンス島は「陥落」し、西湖に...
[51CTO.com クイック翻訳] サーバーレステクノロジーはオンデマンドコンピューティングの最新...