如何在Spring Boot中实现Redis分布式锁?
时间: 2024-05-15 21:12:43 浏览: 88
SpringBoot使用Redis实现分布式锁
5星 · 资源好评率100%
要在Spring Boot中实现Redis分布式锁,你需要执行以下步骤:
1. 添加Redis依赖:在pom.xml文件中添加以下依赖:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
```
2. 创建Redis锁工具类:创建一个Redis锁工具类,包含获取锁、释放锁和扩展锁等方法。你可以使用Redis的setnx命令(set if not exists)来设置一个键值对,如果键值对不存在,则设置成功,表示获取锁成功;如果键值对已经存在,则设置失败,表示获取锁失败。在释放锁时,使用Redis的del命令删除相应的键值对。
```java
@Component
public class RedisLock {
@Autowired
private StringRedisTemplate redisTemplate;
/**
* 获取锁
*
* @param key 锁键
* @param value 锁值
* @param expire 过期时间(毫秒)
* @return true表示获取锁成功,false表示获取锁失败
*/
public boolean lock(String key, String value, long expire) {
Boolean result = redisTemplate.opsForValue().setIfAbsent(key, value, Duration.ofMillis(expire));
return result != null && result;
}
/**
* 释放锁
*
* @param key 锁键
* @param value 锁值
* @return true表示释放锁成功,false表示释放锁失败
*/
public boolean unlock(String key, String value) {
String currentValue = redisTemplate.opsForValue().get(key);
if (currentValue == null) {
return false;
}
if (currentValue.equals(value)) {
redisTemplate.opsForValue().getOperations().delete(key);
return true;
}
return false;
}
/**
* 扩展锁过期时间
*
* @param key 锁键
* @param value 锁值
* @param expire 扩展的过期时间(毫秒)
* @return true表示扩展锁过期时间成功,false表示扩展锁过期时间失败
*/
public boolean expire(String key, String value, long expire) {
String currentValue = redisTemplate.opsForValue().get(key);
if (currentValue == null) {
return false;
}
if (currentValue.equals(value)) {
redisTemplate.expire(key, Duration.ofMillis(expire));
return true;
}
return false;
}
}
```
3. 使用锁:在需要加锁的方法中,先调用lock方法获取锁,如果获取锁成功,则执行业务逻辑,最后调用unlock方法释放锁。为了防止死锁,可以设置一个过期时间,当锁过期后自动释放。
```java
@Service
public class UserService {
@Autowired
private RedisLock redisLock;
public void updateUser(String userId, String userName) {
// 加锁
String lockKey = "user:" + userId;
String lockValue = UUID.randomUUID().toString();
boolean lockResult = redisLock.lock(lockKey, lockValue, 5000);
if (!lockResult) {
throw new RuntimeException("获取锁失败");
}
try {
// 执行业务逻辑
User user = userRepository.findById(userId).orElse(null);
if (user != null) {
user.setName(userName);
userRepository.save(user);
}
} finally {
// 释放锁
redisLock.unlock(lockKey, lockValue);
}
}
}
```
这样,你就可以在Spring Boot中使用Redis分布式锁了。
阅读全文