最近公司商城订单出现重复订单数据问题,比较棘手,一直在找原因,没有发现问题,太坑了,后来决定在原有的业务基础上面加上防刷单处理和redis分布式锁,双重保证应用的安全和稳定性。
一、防刷单原理:防止一个方法,在方法参数值相同的情况下,短时间频繁调用,这里根据spring中的AOP原理来实现的,自己定义了一个注解,这个注解主要用来判断哪些方法上面加了这个注解,就做参数请求处理,先配置具体的aop切面路径扫描类中的方法,处理是根据这个请求的路径获取相应的方法中的参数做具体分析。
实现的步骤:
定义一个注解(主要用来判断哪些方法要做防重复提交处理)- 通过spring中的AOP进行扫描,方法处理。
- 设置一个过期时间来处理redis分布式锁处理(这里会在redis分布式锁中实现)
/*********定义防重复请求方法注解*********/
package com.lolaage.common.annotations;
import java.lang.annotation.*;
/**
* 定义一个注解(主要用来判断哪些方法要做防重复提交处理)
* @Description 防止同一个方法被频繁执行(是否需要频繁执行看参数params是否不一样)
* @Date 19:35 2019/4/9
* @Param
* @return
**/
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SameMethodFrequentlyRun {
/**
* @Description 当方法的参数是实体对象,对象必须对象重写equal和hashcode方法
**/
String params() default "";
String description() default "";
/**
* @Description
**/
long milliseconds() default 30000L;
}
/*************下面是具体的方法处理请求参数过程***************/
package com.lolaage.common.aop;
import com.lolaage.base.po.JsonModel;
import com.lolaage.common.annotations.SameMethodFrequentlyRun;
import com.lolaage.helper.util.RedisLockTemplate;
import com.lolaage.util.StringUtil;
import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.A

本文介绍了如何利用Java的AOP和Redis分布式锁防止方法重复调用,以解决商城订单重复的问题。首先,通过自定义注解和AOP进行防刷单处理,然后详细阐述了Redis分布式锁的工作原理,包括设置过期时间和使用eval解锁。文章还讨论了方案的优点和缺点,如适用场景、主从切换时的锁丢失风险,并提供了相关解决方案链接和代码下载地址。
最低0.47元/天 解锁文章
2809

被折叠的 条评论
为什么被折叠?



