springboot加Redis实现分布式锁代码
时间: 2023-12-21 14:03:53 浏览: 102
SpringBoot使用Redis实现分布式锁
5星 · 资源好评率100%
好的,下面是使用Spring Boot和Redis实现分布式锁的示例代码:
```java
@Component
public class RedisLockUtil {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
private static final String LOCK_PREFIX = "lock_";
private static final long LOCK_EXPIRE = 30 * 1000L; // 锁过期时间30秒
/**
* 获取锁
*
* @param key 锁的key
* @return 是否获取成功
*/
public boolean lock(String key) {
String lockKey = LOCK_PREFIX + key;
long now = System.currentTimeMillis();
long expireTime = now + LOCK_EXPIRE + 1; // 锁过期时间
boolean acquired = redisTemplate.opsForValue().setIfAbsent(lockKey, expireTime);
if (acquired) {
return true;
} else {
Long expire = redisTemplate.opsForValue().getOperations().getExpire(lockKey);
if (expire == -1) { // 如果key没有设置过期时间,直接设置过期时间
redisTemplate.expire(lockKey, LOCK_EXPIRE, TimeUnit.MILLISECONDS);
}
return false;
}
}
/**
* 释放锁
*
* @param key 锁的key
* @return 是否释放成功
*/
public boolean release(String key) {
String lockKey = LOCK_PREFIX + key;
Long expireTime = (Long) redisTemplate.opsForValue().get(lockKey);
if (expireTime == null) {
return true;
}
if (expireTime > System.currentTimeMillis()) {
redisTemplate.delete(lockKey);
return true;
} else {
return false;
}
}
}
```
在需要使用分布式锁的地方,注入RedisLockUtil,使用lock方法获取锁,使用release方法释放锁。
```java
@Autowired
private RedisLockUtil redisLockUtil;
public void doSomethingWithLock(String key) {
if (redisLockUtil.lock(key)) {
try {
// 执行业务逻辑
} finally {
redisLockUtil.release(key);
}
} else {
// 获取锁失败,处理逻辑
}
}
```
以上代码仅供参考,实际使用时需要根据实际情况进行修改和优化。
阅读全文