JavaによるRedis分散ロックの実装方法

JavaでRedis分散ロックを実装するには、RedisのSETNXコマンドを使用できます。以下に簡単なサンプルコードを示します。

import redis.clients.jedis.Jedis;

public class RedisDistributedLock {
    private final Jedis jedis;
    private final String lockKey;
    private final long expireTime;

    public RedisDistributedLock(Jedis jedis, String lockKey, long expireTime) {
        this.jedis = jedis;
        this.lockKey = lockKey;
        this.expireTime = expireTime;
    }

    public boolean tryLock() {
        String result = jedis.set(lockKey, "", "NX", "EX", expireTime);
        return "OK".equals(result);
    }

    public void unlock() {
        jedis.del(lockKey);
    }
}

上述コードのRedisDistributedLockクラスは、コンストラクタでJedisインスタンス、ロックのキー名、有効期限を受け取ります。tryLockメソッドは、RedisのSETNXコマンドを使用してロックの取得を試行します。結果が「OK」の場合、ロックは取得されました。そうでない場合は、ロックは取得されませんでした。unlockメソッドは、ロックが解放されます。つまり、キーが削除されます。

使用方法:

import redis.clients.jedis.Jedis;

public class Main {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost", 6379);

        RedisDistributedLock lock = new RedisDistributedLock(jedis, "mylock", 10);

        if (lock.tryLock()) {
            try {
                // 获取到锁之后的业务逻辑
                System.out.println("获取到锁");
            } finally {
                lock.unlock();
            }
        } else {
            // 未获取到锁的处理逻辑
            System.out.println("未获取到锁");
        }

        jedis.close();
    }
}

Jedisインスタンスを作成し、ロックキー「mylock」、10秒の有効期限を指定したRedisDistributedLockオブジェクトを作成後、tryLockメソッドを呼び出してロックを取得する。ロックが取得できれば取得後の処理を行い、最後にロックを解放する。ロックの取得に失敗した場合には、取得できなかったときの処理を行う。

ロックの有効期限が長い場合、デッドロックが発生する場合があることに注意してください。デッドロックを回避するために、ビジネスロジックにタイムアウトメカニズムを追加できます。ビジネスロジックが一定時間内に完了しない場合は、ロックを主动的に解放できます。

bannerAds