使用java+springboot+springaop+redis+自定义注解,写一个redis分布式锁
时间: 2023-05-12 10:06:10 浏览: 209
用注解实现redis分布式锁,防止短时间内重复请求
可以使用以下代码实现:
```java
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RedisLock {
String key();
long expire() default 30000;
long timeout() default 10000;
}
@Component
@Aspect
public class RedisLockAspect {
private static final Logger logger = LoggerFactory.getLogger(RedisLockAspect.class);
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Around("@annotation(redisLock)")
public Object around(ProceedingJoinPoint joinPoint, RedisLock redisLock) throws Throwable {
String key = redisLock.key();
long expire = redisLock.expire();
long timeout = redisLock.timeout();
String value = UUID.randomUUID().toString();
long start = System.currentTimeMillis();
while (System.currentTimeMillis() - start < timeout) {
if (redisTemplate.opsForValue().setIfAbsent(key, value, expire, TimeUnit.MILLISECONDS)) {
try {
return joinPoint.proceed();
} finally {
redisTemplate.delete(key);
}
}
Thread.sleep(100);
}
throw new RuntimeException("获取锁超时");
}
}
```
这段代码定义了一个 RedisLock 注解,用于标记需要加锁的方法。在 RedisLockAspect 类中,使用 @Around 注解拦截被 RedisLock 标记的方法,并实现了分布式锁的逻辑。具体来说,它会在 Redis 中尝试设置一个 key,如果设置成功,则表示获取到了锁,执行方法并在方法执行完成后释放锁;否则会等待一段时间后重试,直到超时。
阅读全文