Java 利用分布式共享锁实现防止方法重复调用(防刷单及redis分布式锁的实现)

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

   最近公司商城订单出现重复订单数据问题,比较棘手,一直在找原因,没有发现问题,太坑了,后来决定在原有的业务基础上面加上防刷单处理和redis分布式锁,双重保证应用的安全和稳定性。


一、防刷单原理:防止一个方法,在方法参数值相同的情况下,短时间频繁调用,这里根据spring中的AOP原理来实现的,自己定义了一个注解,这个注解主要用来判断哪些方法上面加了这个注解,就做参数请求处理,先配置具体的aop切面路径扫描类中的方法,处理是根据这个请求的路径获取相应的方法中的参数做具体分析。

实现的步骤:

  1. 定义一个注解(主要用来判断哪些方法要做防重复提交处理)
  2. 通过spring中的AOP进行扫描,方法处理。
  3. 设置一个过期时间来处理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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值