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メソッドを呼び出してロックを取得する。ロックが取得できれば取得後の処理を行い、最後にロックを解放する。ロックの取得に失敗した場合には、取得できなかったときの処理を行う。
ロックの有効期限が長い場合、デッドロックが発生する場合があることに注意してください。デッドロックを回避するために、ビジネスロジックにタイムアウトメカニズムを追加できます。ビジネスロジックが一定時間内に完了しない場合は、ロックを主动的に解放できます。