redisson-spring-boot-starter 2.15.2 编写切面分布式锁
时间: 2023-07-09 22:14:40 浏览: 51
可以通过编写切面来实现对方法的分布式锁拦截。
具体步骤如下:
1. 定义切面类 RedissonLockAspect,通过 @Component 注解将其声明为 Spring 的组件。
```java
@Aspect
@Component
public class RedissonLockAspect {
private final RedissonClient redisson;
public RedissonLockAspect(RedissonClient redisson) {
this.redisson = redisson;
}
@Around("@annotation(redissonLock)")
public Object doAround(ProceedingJoinPoint joinPoint, RedissonLock redissonLock) throws Throwable {
String lockName = redissonLock.name();
long leaseTime = redissonLock.leaseTime();
RLock lock = redisson.getLock(lockName);
try {
// 获取锁
lock.tryLock(leaseTime, TimeUnit.SECONDS);
// 执行方法
return joinPoint.proceed();
} finally {
// 释放锁
lock.unlock();
}
}
}
```
2. 在切面类 RedissonLockAspect 中通过 @Around 注解定义拦截规则,拦截使用了 @RedissonLock 注解的方法。
3. 在拦截方法中获取锁,执行方法,释放锁。
4. 在 Spring Boot 启动类上添加 @EnableAspectJAutoProxy 注解开启切面自动代理。
示例代码如下:
```java
@Aspect
@Component
public class RedissonLockAspect {
private final RedissonClient redisson;
public RedissonLockAspect(RedissonClient redisson) {
this.redisson = redisson;
}
@Around("@annotation(redissonLock)")
public Object doAround(ProceedingJoinPoint joinPoint, RedissonLock redissonLock) throws Throwable {
String lockName = redissonLock.name();
long leaseTime = redissonLock.leaseTime();
RLock lock = redisson.getLock(lockName);
try {
// 获取锁
lock.tryLock(leaseTime, TimeUnit.SECONDS);
// 执行方法
return joinPoint.proceed();
} finally {
// 释放锁
lock.unlock();
}
}
}
```
```java
@Service
public class UserService {
@RedissonLock(name = "user_lock", leaseTime = 10)
public void updateUser(String userId) {
// 处理业务逻辑
}
}
```
```java
@SpringBootApplication
@EnableAspectJAutoProxy
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
```
需要注意的是,在使用切面拦截方法时,需要保证 RedissonClient 已经初始化完成,否则会出现空指针异常。可以通过构造函数注入 RedissonClient 对象,确保 RedissonClient 在切面类实例化时已经初始化完成。