java封装redisLock 分布式锁
时间: 2023-09-29 08:08:28 浏览: 126
在Java中使用Redis实现分布式锁的封装流程如下:
1. 引入Redis客户端依赖,例如Jedis。
2. 定义一个RedisLock类,包含以下方法:
- 构造方法:传入Redis连接信息,例如Redis的host、port、password等。
- lock方法:尝试获取锁,如果获取成功,返回true;如果获取失败,返回false。
- unlock方法:释放锁。
3. 实现lock方法,代码如下:
```java
public boolean lock(String lockKey, String requestId, int expireTime) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
// 尝试获取锁,如果获取成功,返回true
String result = jedis.set(lockKey, requestId, "NX", "PX", expireTime);
return "OK".equals(result);
} catch (Exception e) {
// 异常处理
} finally {
if (jedis != null) {
jedis.close();
}
}
return false;
}
```
其中,lockKey为锁的名称,requestId为请求的标识,expireTime为锁的过期时间,单位为毫秒。
4. 实现unlock方法,代码如下:
```java
public void unlock(String lockKey, String requestId) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
String value = jedis.get(lockKey);
if (requestId.equals(value)) {
jedis.del(lockKey);
}
} catch (Exception e) {
// 异常处理
} finally {
if (jedis != null) {
jedis.close();
}
}
}
```
其中,如果requestId和锁的值相等,则说明当前线程持有该锁,此时可以释放锁。
5. 使用示例:
```java
public static void main(String[] args) {
RedisLock redisLock = new RedisLock("localhost", 6379, "password");
String lockKey = "lock_key";
String requestId = UUID.randomUUID().toString();
int expireTime = 10000;
boolean locked = redisLock.lock(lockKey, requestId, expireTime);
if (locked) {
// 获取锁成功,执行业务逻辑
// ...
redisLock.unlock(lockKey, requestId);
}
}
```
其中,首先创建RedisLock实例,然后调用lock方法尝试获取锁,如果获取成功,则执行业务逻辑,并在最后调用unlock方法释放锁。
阅读全文