java代码实现redis分布式锁,任务结束后才开锁
时间: 2023-06-30 19:03:10 浏览: 101
实现分布式锁的一种方式是使用Redis的SETNX命令。以下是Java代码实现Redis分布式锁的示例:
```java
import redis.clients.jedis.Jedis;
public class RedisDistributedLock {
private static final String LOCK_KEY = "distributed_lock";
private static final int LOCK_EXPIRY_TIME = 30000; // 锁的过期时间:30秒
private Jedis jedis;
public RedisDistributedLock(Jedis jedis) {
this.jedis = jedis;
}
public boolean lock() {
long lockExpiryTime = System.currentTimeMillis() + LOCK_EXPIRY_TIME + 1;
String lockExpiryTimeStr = String.valueOf(lockExpiryTime);
// 尝试获取锁
if (jedis.setnx(LOCK_KEY, lockExpiryTimeStr) == 1) {
// 成功获取锁
return true;
}
// 检查锁是否过期
String currentLockExpiryTimeStr = jedis.get(LOCK_KEY);
if (currentLockExpiryTimeStr != null && Long.parseLong(currentLockExpiryTimeStr) < System.currentTimeMillis()) {
// 锁已过期,尝试获取锁
String oldLockExpiryTimeStr = jedis.getSet(LOCK_KEY, lockExpiryTimeStr);
if (oldLockExpiryTimeStr != null && oldLockExpiryTimeStr.equals(currentLockExpiryTimeStr)) {
// 成功获取锁
return true;
}
}
// 未获取到锁
return false;
}
public void unlock() {
jedis.del(LOCK_KEY);
}
}
```
使用分布式锁的代码示例:
```java
import redis.clients.jedis.Jedis;
public class MyTask {
private RedisDistributedLock lock;
private Jedis jedis;
public MyTask(Jedis jedis) {
this.jedis = jedis;
this.lock = new RedisDistributedLock(jedis);
}
public void run() {
boolean locked = lock.lock();
if (locked) {
try {
// 执行任务
} finally {
lock.unlock();
}
} else {
// 未获取到锁,任务不能执行
}
}
}
```
在使用分布式锁时,两个或多个线程/进程可能同时尝试获取锁。在代码示例中,只有一个线程/进程可以获取锁并运行任务。在任务完成后,使用unlock()方法释放锁。
阅读全文