java实现redis分布式锁(附完整源码)
时间: 2023-07-06 17:41:29 浏览: 59
以下是Java实现Redis分布式锁的完整源码:
```java
import redis.clients.jedis.Jedis;
public class RedisDistributedLock {
private static final String LOCK_KEY = "lock";
private static final int LOCK_EXPIRE = 30000; // 锁过期时间,单位毫秒
private Jedis jedis;
public RedisDistributedLock(Jedis jedis) {
this.jedis = jedis;
}
public boolean tryLock(String requestId) {
String result = jedis.set(LOCK_KEY, requestId, "NX", "PX", LOCK_EXPIRE);
return result != null && result.equals("OK");
}
public void releaseLock(String requestId) {
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
jedis.eval(script, 1, LOCK_KEY, requestId);
}
}
```
在这个示例中,我们使用Redis作为分布式锁的存储介质。`tryLock()`方法用于尝试获取锁,它会向Redis中写入一个带有过期时间的键值对。如果锁已被其他线程占用,则该方法将返回false。`releaseLock()`方法用于释放锁,它会通过执行一段Lua脚本来确保只有占用锁的线程才能释放该锁。
你可以根据需要修改`LOCK_KEY`和`LOCK_EXPIRE`常量来适应不同的需求。创建`RedisDistributedLock`对象后,你可以使用`tryLock()`方法尝试获取锁,使用`releaseLock()`方法释放锁。需要注意的是,在释放锁之前,你需要确保当前线程占有该锁。