-
创建AOP接口相关
@Target(ElementType.
METHOD
)
@Retention(RetentionPolicy.
RUNTIME
)
public @interface RedisLock {
//redis锁的key
public String key();
//过期时间
public long timeOut();
//和key一起组成的key名称。例如 key_abc
public String keyFieldName();
//从请求端获取的数据字段
public String valueFieldName();
//1:防重复提交。2:锁定数据:锁定数据以 valueFieldName 字段的数据为判断是不是同一个人的请求
public String lockType();
//返回的msg信息
public String returnMsg();
}
2、
@Aspect
@Component
public class RedisLockAspect {
@Autowired
private RedisUtils redisUtils;
@Pointcut(“@annotation(com.robotime.common.annotation.RedisLock)”)
public void pointCut() {
}
@Before(“pointCut()”)
public void before(JoinPoint point) {
RedisLock redisLock = getAnnotationLog(point);
if (redisLock == null) {
return;
}
Object[] args = point.getArgs();
Map<String, Object> map = JSONObject.
parseObject
(JSON.
toJSONString
(args[0]));
String key = map.get(redisLock.keyFieldName()).toString();
String value = map.get(redisLock.valueFieldName()).toString();
Boolean lock = redisUtils.setIfAbsent(redisLock.key() + key, value, redisLock.timeOut());
if (!lock) {
if(“1”.equals(redisLock.lockType())){
System.
out
.println(“—————————-锁—————————–“);
System.
out
.println(“频繁操作提交”);
throw new RedisLockRuntimeException(110,redisLock.returnMsg());
}else if(“2”.equals(redisLock.lockType())){
Object redisValue = redisUtils.get(“redis_lock_” + redisLock.key() + key);
String lockValue = redisValue != null ? redisValue.toString() : null;
if (lockValue != null && !lockValue.equals(value)) {
System.
out
.println(“—————————-锁—————————–“);
throw new RedisLockRuntimeException(110,redisLock.returnMsg());
}
}
}
}
/**
* 是否存在注解,如果存在就获取
*/
private RedisLock getAnnotationLog(JoinPoint joinPoint) {
Signature signature = joinPoint.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method method = methodSignature.getMethod();
if (method != null) {
return method.getAnnotation(RedisLock.class);
}
return null;
}
}
使用方法一:表单防重复提交
其中。
keyFieldName = “userId”。valueFieldName = “userId”。中的userId,为 Pintu 实体类中的字段。
使用方法二:数据锁。
注意:使用这种方式。接口接收参数的方式必须为
@RequestBody 实体类。否在在aop中
Map<String, Object> map = JSONObject.
parseObject
(JSON.
toJSONString
(args[0]));
方法获取不到参数。
请作者喝咖啡