由于业务权限服务,相同数据可能存在多人操作的情况,所以存在共享资源操作竞争问题,如果针对于业务单独去控制,成本比较高,具体控制还要耦合于业务中,如果使用不规范,很容易造成竞争死锁问题,所以次处分享一个基于AOP的分布式锁的start。欢迎一起探讨,对于增强改进的地方欢迎提供建议。
此处利用aop的MethodInterceptor进行方法级别的拦截,并且配合注解使用完成整个流程。
一、主要注解
1.启动Redission配置的注解Enable注解:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({
RedissonConfiguration.class, LockMethodHelper.class})
public @interface EnableRedissonLock {
}
2.方法上是否启动锁
@Target({
ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface NeedLock {
String fieldKey();
}
3.key拼接注解:
@Documented
@Target({
ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface KeyParam {
/**
* 如果动态参数在command对象中,那么就需要设置columns的值为command对象中的属性名可以为多个,否则不需要设置该值
* <p>例1:public void test(@KeyParam({"id"}) MemberCommand member)
* <p>例2:public void test(@KeyParam({"id","loginName"}) MemberCommand member)
* <p>例3:public void test(@KeyParam String memberId)
*/
String[] columns() default {
};
/**
* 获取锁等待时间
*
* @return 等待时间
*/
long waitTime() default 1L;
/**
* 锁释放时间
*
* @return 自动释放时间
*/
long leaseTime() default 5L;
}
二、Redisssion的配置
1、基本配置参数封装
@Setter
@Getter
@Configuration
@ConfigurationProperties(prefix = "spring.redisson")
public class RedissonProperties {
/**
* redis访问地址
*/
private String address;
/**
* 配置模式
*/
private String connectModel;
/**
* 密码
*/
private String password;
/**