Java注解方式基于Redission实现分布式锁

Posted load6685

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java注解方式基于Redission实现分布式锁相关的知识,希望对你有一定的参考价值。

1、定义注解类

@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DistributedLock {
    //锁名称
    String lockName() default "";

    //释放时间
    long releaseTime() default 5*1000;

    //时间单位
    TimeUnit timeUnit() default TimeUnit.MILLISECONDS;
}

 

2、定义切面拦截  DistributedLock 注解

@Aspect
@Component
@Slf4j
public class DistributedLockAspect {

    @Autowired
    private RedissonClient redissonClient;

   //这里需要修改对应的包名 @Pointcut(
"@annotation(com.utils.annotation.DistributedLock)") public void RlockAspect() { } @Around("RlockAspect()") public Object arround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { Object object = null; RLock lock = null; log.info("rlockAspect start "); try { DistributedLock rlockInfo = getRlockInfo(proceedingJoinPoint); String lockKey = getLocalKey(proceedingJoinPoint, rlockInfo); lock = redissonClient.getLock(lockKey); if (lock != null) { final boolean status = lock.tryLock(rlockInfo.releaseTime(), rlockInfo.timeUnit()); if (status) { object = proceedingJoinPoint.proceed(); } } else { log.info("未获取到锁:{}", lockKey); } } finally { // 当前线程获取到锁再释放锁 if (lock != null && lock.isHeldByCurrentThread()) { lock.unlock(); } } return object; } public DistributedLock getRlockInfo(ProceedingJoinPoint proceedingJoinPoint) { MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature(); return methodSignature.getMethod().getAnnotation(DistributedLock.class); } /** * 获取redis lock key * * @param proceedingJoinPoint * @return */ public String getLocalKey(ProceedingJoinPoint proceedingJoinPoint, DistributedLock rlockInfo) { StringBuilder localKey = new StringBuilder("Rlock"); final Object[] args = proceedingJoinPoint.getArgs(); String businessNo = ""; // 如果没有设置锁值 if (StringUtils.isNotEmpty(rlockInfo.lockName())) { businessNo = rlockInfo.lockName(); } else { MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature(); Class[] parameters = methodSignature.getParameterTypes(); String methodName = methodSignature.getMethod().getName(); if (parameters != null) { for (int i = 0; i < parameters.length; i++) { Class parameter = parameters[i]; if (parameter.getSimpleName().equals("NDevice")) { NDevice de = (NDevice) args[i]; businessNo = de.getUuid() + methodName; } if (parameter.getSimpleName().equals("FrameBean")) { FrameBean de = (FrameBean) args[i]; businessNo = de.getColumn1() + methodName; } } // 如果没有获取到业务编号,则使用方法签名 if (StringUtils.isEmpty(businessNo)) { businessNo = methodName; } } } return businessNo; } }

3、使用方法:在需要用分布式锁的方法上面加  @DistributedLock 注解即可

以上是关于Java注解方式基于Redission实现分布式锁的主要内容,如果未能解决你的问题,请参考以下文章

Redis | 黑马点评 + 思维导图分布式锁

详解redission分布式锁配置及使用,防止java服务重复提交和修改动作等问题

详解redission分布式锁配置及使用,防止java服务重复提交和修改动作等问题

REDIS10_Redission的入门案例多主案例搭建分布式锁进行加锁解锁底层源码解析

REDIS10_Redission的入门案例多主案例搭建分布式锁进行加锁解锁底层源码解析

分布式锁 Redission 介绍及使用其可重入锁 和 WatchDog 机制 和 MutiLock原理