当前位置: 首页 > 编程笔记 >

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

端木兴国
2023-03-14
本文向大家介绍Java注解如何基于Redission实现分布式锁,包括了Java注解如何基于Redission实现分布式锁的使用技巧和注意事项,需要的朋友参考一下

这篇文章主要介绍了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 注解即可

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍Zookeeper 如何实现分布式锁?相关面试题,主要包含被问及Zookeeper 如何实现分布式锁?时的应答技巧和注意事项,需要的朋友参考一下 分布式锁的实现方式有很多种,比如 、数据库 、 等。个人认为 在实现分布式锁这方面是非常非常简单的。 上面我们已经提到过了 zk在高并发的情况下保证节点创建的全局唯一性,这玩意一看就知道能干啥了。实现互斥锁呗,又因为能在分布式的情况下,所以

  • 关于最近很多人在询问,如何利用EasySwoole做分布式负载均衡,复杂的就不讲解了,就讲解如何实现最简单的负载均衡。 相关知识 DNS轮训 一个域名针对多个ip A记录的解析,DNS服务器将解析请求按照A记录的顺序,逐一分配到不同的IP上,这样就完成了简单的负载均衡。 DNS轮询的优点: 低成本:只是在DNS服务器上绑定几个A记录,域名注册商一般都免费提供解析服务。 部署简单:就是在网络拓扑进行

  • 本文向大家介绍基于Redis实现分布式应用限流的方法,包括了基于Redis实现分布式应用限流的方法的使用技巧和注意事项,需要的朋友参考一下 限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务。 前几天在DD的公众号,看了一篇关于使用 瓜娃 实现单应用限流的方案 --》原文,参考《redis in action》 实现了一个jedis

  • 主要内容:1. 开启注解事务,2. 使用 @Transactional 注解,示例 1在《 Spring基于XML实现事务管理》一节中,我们通过 <tx:advice> 元素极大的简化了 Spring 声明式事务所需的 XML 配置。但其实我们还可以通过另一种方式进行进一步的简化,那就是“使用注解实现事务管理”。 在 Spring 中,声明式事务除了可以使用 XML 实现外,还可以使用注解实现,以进一步降低代码之间的耦合度。下面我们就来介绍下,通过注解是如何实现声明式事务管理。 1

  • 本文向大家介绍如何基于java实现解压ZIP TAR等文件,包括了如何基于java实现解压ZIP TAR等文件的使用技巧和注意事项,需要的朋友参考一下   java实现对常用.ZIP , .TAR, .TAR.BZ2, .BZ2 ,.TAR.GZ ,.GZ格式文件的解压。   首先需要引入maven依赖,这里使用的是Apache的压缩工具包common-compress,改工具包支持解压、压缩,此

  • 一个挺着啤酒肚,身穿格子衫,发际线严重后移的中年男子,手拿着保温杯,胳膊夹着MacBook向你走来,看样子是架构师级别。 面试开始, 直入正题。 面试官: 你有没有参与过秒杀系统的设计? 我: 没有,我平时都是开发后台管理系统、OA办公系统、内部管理系统,从来没有开发过秒杀系统。 面试官: 嗯...,小伙子很实诚。今天就先到这里吧,后面有消息会主动联系你。 后面还可能有消息吗?你们啥时候主动联系过

  • 背景 在很多互联网产品应用中,有些场景需要加锁处理,比如:秒杀,全局递增ID,楼层生成等等。大部分的解决方案是基于DB实现的,Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对redis的连接并不存在竞争关系。其次Redis提供一些命令SETNX,GETSET,可以方便实现分布式锁机制。 一、使用分布式锁要满足的几个条件: 系统是一个分布式系统(关键是分布式,单机的可以

  • 本文向大家介绍基于jquery实现瀑布流布局,包括了基于jquery实现瀑布流布局的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家介绍了基于jquery实现瀑布流布局的关键代码,分享给大家供大家参考,具体内容如下 效果图: 具体代码: 使用jquery-1.8.3.min.js,waterfall.js代码如下: 希望本文所述对大家学习有所帮助,谢谢大家的阅读。