ホームページ データベース Redis Redis と Java を使用して分散ロック機能を開発する方法

Redis と Java を使用して分散ロック機能を開発する方法

Sep 21, 2023 am 08:40 AM
java redis 分散ロック

Redis と Java を使用して分散ロック機能を開発する方法

Redis と Java を使用して分散ロック機能を開発する方法

  1. はじめに
    分散ロックとは、共有リソースへのアクセスの相互排他を実現することです。分散システムの仕組み。複数のノードが共有リソースに同時にアクセスする場合、1 つのノードのみがアクセスし、他のノードは待機する必要があることを確認する必要があります。 Redis は、高性能かつ信頼性の高い一般的に使用されるインメモリ データベースであり、分散ロックの実装に非常に適しています。
  2. Redis の setnx コマンド
    Redis の setnx コマンドはキーの値を設定するために使用できますが、設定操作はキーが存在しない場合にのみ実行されます。この機能を使用して、分散ロック取得操作を実装できます。 setnx コマンドを使用して、最初に有効期限付きのキーの設定を試みます。設定が成功した場合は、ロックが正常に取得されたことを意味します。そうでない場合は、ロックが他のノードによって取得されたことを意味します。
  3. Java コードの例
    次は、Java 言語と Redis を使用して分散ロックを実装するサンプル コードです。
import redis.clients.jedis.Jedis;

public class DistributedLock {
    private static final String LOCK_KEY = "distributed_lock";
    private static final int LOCK_TIMEOUT = 3 * 1000; // 锁的超时时间,单位为毫秒
    
    private Jedis jedis;

    public DistributedLock(Jedis jedis) {
        this.jedis = jedis;
    }

    public boolean lock() {
        long start = System.currentTimeMillis();
        try {
            while (true) {
                String result = jedis.set(LOCK_KEY, "locked", "NX", "PX", LOCK_TIMEOUT);
                if ("OK".equals(result)) {
                    return true;
                } else {
                    // 进行重试
                    Thread.sleep(100);
                }
                long end = System.currentTimeMillis();
                if (end - start > LOCK_TIMEOUT) {
                    // 超时退出
                    return false;
                }
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            return false;
        }
    }

    public void unlock() {
        jedis.del(LOCK_KEY);
    }
}
ログイン後にコピー
  1. サンプルの説明
    上記の内容Jedis ライブラリを使用して Redis を操作するサンプル コード。まず、定数 LOCK_KEY が分散ロックのキーとして定義されます。このキーはすべてのノード間で一意である必要があります。さらに、ロック タイムアウトを表すために LOCK_TIMEOUT 定数が設定されます。

lock メソッドでは、まず開始時刻として現在時刻を取得し、次に無限ループを使用して分散ロックの取得を試みます。ループ内ではRedisのsetコマンドを使用して設定操作を行っており、設定キーはLOCK_KEY、値は「locked」、NXとPX オプション、NX はキーが存在しない場合にのみ設定操作が実行されることを意味し、PX は設定されたキーの有効期限を意味しますは LOCK_TIMEOUT ミリ秒です。

設定が成功した場合は、ロックが正常に取得されたことを意味し、メソッドは

true を返します。そうでない場合は、再試行が続行され、再試行ごとに 100 ミリ秒待機します。同時に、ロックを取得する時間が LOCK_TIMEOUT の値を超えているかどうかも判断する必要があります。超えている場合は、ロックを取得するまでの待ち時間が長すぎることを意味します。ロックを取得し、false を返します。

unlock メソッドで、del コマンドを呼び出して分散ロックのキーを削除します。

    呼び出し例
  1. サンプル コードを使用した呼び出し例を次に示します。
  2. import redis.clients.jedis.Jedis;
    
    public class LockTest {
        public static void main(String[] args) {
            Jedis jedis = new Jedis("localhost");
            DistributedLock lock = new DistributedLock(jedis);
            try {
                if (lock.lock()) {
                    // 获取到分布式锁后执行需要保护的代码
                    System.out.println("获取到分布式锁");
                    // ... 执行需要保护的代码
                } else {
                    System.out.println("获取分布式锁失败");
                }
            } finally {
                lock.unlock();
            }
        }
    }
    ログイン後にコピー
    呼び出し例では、最初に Jedis 接続オブジェクトが作成され、次にDistributedLock オブジェクト。Jedis 接続オブジェクトをパラメータとして渡します。 try-finallyブロックでは、まず分散ロックの取得を試み、成功した場合は「分散ロック取得」を出力し、保護する必要のあるコードを実行し、finallyブロックで分散ロックを解放します。

      まとめ
    1. Redis と Java 開発を使用することで、分散ロック機能を簡単に実装できます。ロック取得操作は Redis setnx コマンドを使用して実装でき、Java コードで Redis コマンドを簡単に呼び出して分散ロック クラスにカプセル化できます。実際のアプリケーションでは、分散ロックのタイムアウトを必要に応じて調整して、ロックを取得するまでの待ち時間が長くなりすぎないようにすることで、システムのパフォーマンスと同時実行性を向上させることができます。

    以上がRedis と Java を使用して分散ロック機能を開発する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Redisクラスターモードの構築方法 Redisクラスターモードの構築方法 Apr 10, 2025 pm 10:15 PM

Redisクラスターモードは、シャードを介してRedisインスタンスを複数のサーバーに展開し、スケーラビリティと可用性を向上させます。構造の手順は次のとおりです。異なるポートで奇妙なRedisインスタンスを作成します。 3つのセンチネルインスタンスを作成し、Redisインスタンスを監視し、フェールオーバーを監視します。 Sentinel構成ファイルを構成し、Redisインスタンス情報とフェールオーバー設定の監視を追加します。 Redisインスタンス構成ファイルを構成し、クラスターモードを有効にし、クラスター情報ファイルパスを指定します。各Redisインスタンスの情報を含むnodes.confファイルを作成します。クラスターを起動し、CREATEコマンドを実行してクラスターを作成し、レプリカの数を指定します。クラスターにログインしてクラスター情報コマンドを実行して、クラスターステータスを確認します。作る

PHP対Python:違いを理解します PHP対Python:違いを理解します Apr 11, 2025 am 12:15 AM

PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHPは、シンプルな構文と高い実行効率を備えたWeb開発に適しています。 2。Pythonは、簡潔な構文とリッチライブラリを備えたデータサイエンスと機械学習に適しています。

PHP:Web開発の重要な言語 PHP:Web開発の重要な言語 Apr 13, 2025 am 12:08 AM

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

Redisデータをクリアする方法 Redisデータをクリアする方法 Apr 10, 2025 pm 10:06 PM

Redisデータをクリアする方法:Flushallコマンドを使用して、すべての重要な値をクリアします。 FlushDBコマンドを使用して、現在選択されているデータベースのキー値をクリアします。 [選択]を使用してデータベースを切り替え、FlushDBを使用して複数のデータベースをクリアします。 DELコマンドを使用して、特定のキーを削除します。 Redis-CLIツールを使用してデータをクリアします。

PHP対その他の言語:比較 PHP対その他の言語:比較 Apr 13, 2025 am 12:19 AM

PHPは、特に迅速な開発や動的なコンテンツの処理に適していますが、データサイエンスとエンタープライズレベルのアプリケーションには良くありません。 Pythonと比較して、PHPはWeb開発においてより多くの利点がありますが、データサイエンスの分野ではPythonほど良くありません。 Javaと比較して、PHPはエンタープライズレベルのアプリケーションでより悪化しますが、Web開発により柔軟性があります。 JavaScriptと比較して、PHPはバックエンド開発により簡潔ですが、フロントエンド開発のJavaScriptほど良くありません。

Redisキューの読み方 Redisキューの読み方 Apr 10, 2025 pm 10:12 PM

Redisのキューを読むには、キュー名を取得し、LPOPコマンドを使用して要素を読み、空のキューを処理する必要があります。特定の手順は次のとおりです。キュー名を取得します:「キュー:キュー」などの「キュー:」のプレフィックスで名前を付けます。 LPOPコマンドを使用します。キューのヘッドから要素を排出し、LPOP Queue:My-Queueなどの値を返します。空のキューの処理:キューが空の場合、LPOPはnilを返し、要素を読む前にキューが存在するかどうかを確認できます。

PHP:多くのウェブサイトの基礎 PHP:多くのウェブサイトの基礎 Apr 13, 2025 am 12:07 AM

PHPが多くのWebサイトよりも優先テクノロジースタックである理由には、その使いやすさ、強力なコミュニティサポート、広範な使用が含まれます。 1)初心者に適した学習と使用が簡単です。 2)巨大な開発者コミュニティと豊富なリソースを持っています。 3)WordPress、Drupal、その他のプラットフォームで広く使用されています。 4)Webサーバーとしっかりと統合して、開発の展開を簡素化します。

PHP対Python:コア機能と機能 PHP対Python:コア機能と機能 Apr 13, 2025 am 12:16 AM

PHPとPythonにはそれぞれ独自の利点があり、さまざまなシナリオに適しています。 1.PHPはWeb開発に適しており、組み込みのWebサーバーとRich Functionライブラリを提供します。 2。Pythonは、簡潔な構文と強力な標準ライブラリを備えたデータサイエンスと機械学習に適しています。選択するときは、プロジェクトの要件に基づいて決定する必要があります。

See all articles