【JAVA】使用Redisson、反射、切面调制的分布式锁注解

该博客介绍了如何在Java中通过Redisson实现分布式锁,并结合反射和切面编程(AOP)来创建一个注解,确保在高并发场景下,对数据库的毫秒级操作不会发生版本冲突。文章详细阐述了注解的定义、切面类的实现、执行顺序的控制以及注意事项,包括避免锁过期和锁持有线程的判断。此外,还提供了一个可扩展的handler接口和使用示例,经过线上验证,此方案已得到实际应用。
摘要由CSDN通过智能技术生成

需求描述

1.数据库隔离级别为RC
2.存在大量毫秒级别并发场景,RC隔离级别下的mysql去获取同样的事务版本,对同样表的修改会有被相互覆盖的情况
3.需要以方法为维度加上分布式锁,保证毫秒级别的并发里,对同一张表的操作不会有同样的版本号
4.锁应该以方法为维度,方便加在持久层(对数据库单表操作)或者直接加在服务层的方法上

代码

定义一个注解

package com.chriswei.annotation;

import com.chriswei.aspect.methodLock.IMethodLockHandler;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 方法锁
 *
 * @author chriswei
 * @since 1.0.0
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodLock {
   
    /**
     * 标识哪一个参数作为关联锁关键字
     */
    String keyName() default "id";

    /**
     * 是否动态主键,默认是,key值将从入参获取;若否,将以keyName作为key名,而不去考虑入参。
     */
    boolean isDynamicKey() default true;

    /**
     * redis锁的持有时间
     */
    int time() default 1;

    /**
     * 是否需要token区分用户作为锁
     * token从上下文中获取,目的是为了以上下文区作为key值去区分不同的用户
     */
    boolean hasToken() default false;

    /**
     * redis key 前置处理器,用于对从入参中抽取的关键字进行进一步处理
     * 当你面临两把锁的入参是两个不同的值,但是它们两个方法需要同一把锁的时候,可以通过这个方法作进一步处理
     */
    Class<? extends IMethodLockHandler> handler() default IMethodLockHandler.class;
}

注解对应的切面类

package com.chriswei.aspect;

import com.chriswei.lock.api.ILockService;
import com.chriswei.lock.api.Mutex;
import com.chriswei.annotation.MethodLock;
import com.chriswei.aspect.methodLock.IMethodLockHandler;
import com.chriswei.txEngine.context.SpringApplicationContext;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值