文章目录
- [1. 实现原理](#1. 实现原理)
- 2.使用示例
- [3. @Idempotent注解](#3. @Idempotent注解)
- [4. debug过程](#4. debug过程)
主要用途:防止用户快速双击某个按钮,而前端没有禁用,导致发送两次重复请求。
1. 实现原理
幂等性要求参数相同的方法在一定时间内,只能执行一次。本质上是基于redis的分布式锁。大体有以下步骤:
- 方法执行前,利用MD5算法(不仅限于此),将方法名 + 方法参数计算获得一个key
- 查询redis的key是否存在
- 存在,则不执行方法
- 不存在,将key存到redis,并设置过期时间,接着执行方法
- 需要注意方法执行的时间不能超过过期时间
2.使用示例
在Controller添加@Idempotent注解即可。
3. @Idempotent注解
- DefaultIdempotentKeyResolver默认的key解析器
java
public class DefaultIdempotentKeyResolver implements IdempotentKeyResolver {
@Override
public String resolver(JoinPoint joinPoint, Idempotent idempotent) {
// 获得方法名
String methodName = joinPoint.getSignature().toString();
// 将参数拼接成字符串
String argsStr = StrUtil.join(",", joinPoint.getArgs());
// md5计算一个key
return SecureUtil.md5(methodName + argsStr);
}
}
- 对应AOP切面类IdempotentAspect
核心代码如下:
- 生成的key加了前缀"idempotent",参看IdempotentRedisDAO。
4. debug过程
进入resolver方法里面