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

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

redission java_Java注解如何基于Redission实现分布式锁相关推荐

  1. 基于 Redis 实现分布式锁思考

    以下文章来源方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/xuan_lu/article/details/111600302 分布式锁 基于redis实 ...

  2. 基于redis实现分布式锁思考

    分布式锁 基于redis实现分布式锁思考几个问题??? synchronized锁为什么不能应用于分布式锁? synchronized虽然能够解决同步问题,但是每次只有一个线程访问,并且synchro ...

  3. nx set 怎么实现的原子性_基于Redis的分布式锁实现

    前言 本篇文章主要介绍基于Redis的分布式锁实现到底是怎么一回事,其中参考了许多大佬写的文章,算是对分布式锁做一个总结 分布式锁概览 在多线程的环境下,为了保证一个代码块在同一时间只能由一个线程访问 ...

  4. 基于Redis的分布式锁实现

    本文转自 一.分布式锁概览 在多线程的环境下,为了保证一个代码块在同一时间只能由一个线程访问,Java中我们一般可以使用synchronized语法和ReetrantLock去保证,这实际上是本地锁的 ...

  5. redis使用sysc超时_基于redis的分布式锁实现

    随着业务越来越复杂,应用服务都会朝着分布式.集群方向部署,而分布式CAP原则告诉我们,Consistency(一致性). Availability(可用性).Partition tolerance(分 ...

  6. Java基于redis实现分布式锁(SpringBoot)

    前言 分布式锁,其实原理是就是多台机器,去争抢一个资源,谁争抢成功,那么谁就持有了这把锁,然后去执行后续的业务逻辑,执行完毕后,把锁释放掉. 可以通过多种途径实现分布式锁,例如利用数据库(mysql等 ...

  7. Spring Boot基于KLock实现分布式锁的使用详解(一)

    目录 一.背景 二.maven依赖 三.配置 3.1.单节点配置 3.2.集群配置 四.源码及使用 4.1.源码-Klock(<font color=#FF0000>核心注解</fo ...

  8. 基于tair的分布式锁实现原理

    分布式锁概述 分布式锁的实现主要分为三种方式: 1.基于Mysql的行锁实现 优点: 实现简单,不需要额外的中间件来协助实现 缺点: 增大了数据库的读写压力 可能增大数据库的死锁的产生.例如:如果琐是 ...

  9. etcd 笔记(08)— 基于 etcd 实现分布式锁

    1. 为什么需要分布式锁? 在分布式环境下,数据一致性问题一直是个难点.分布式与单机环境最大的不同在于它不是多线程而是多进程.由于多线程可以共享堆内存,因此可以简单地采取内存作为标记存储位置.而多进程 ...

最新文章

  1. Ansible基础一Playbook(二)
  2. 算法分析赛:从数据中挖掘价值,72万奖金,DCIC 2020 大数据赛道来了!
  3. javascript客户端检测技术
  4. Linux用户权限管理
  5. 【Web安全】提权—使用中国菜刀和iis6.exe在目标服务器创建Administrators用户
  6. cubemx 读卡器_cubeMX 之 SD卡读写
  7. SAP S/4HANA: 一条代码线,许多种选择
  8. 对于下一代互联网的畅想
  9. Java06动手动脑
  10. 飞鸽传书认证是互联网界具有极大声望
  11. 车主吐槽某电动车保养割韭菜,却遭其总裁公开恐吓?车主:必须视频道歉
  12. Linux高性能server规划——多线程编程(在)
  13. c语言实验数据类型体会,实验1-C语言开发环境使用和数据类型、运算符、表达式-实验总结与体会...
  14. cad抛物线lisp程序_数控车宏程序编程实用干货,全在这里了...
  15. 怎么判断子元素距离父元素顶部位置_css子元素如何相对父元素定位?
  16. 论文阅读_ICD编码_BERT
  17. 优漫动游平面设计的形式美
  18. planet_Earth靶场渗透记录
  19. 导数的四则运算法则_高考考纲与考向分析——导数的概念与计算
  20. 山东省下辖16个地级市和山东地形图12.5米

热门文章

  1. Spring异步调用原理及SpringAop拦截器链原理
  2. poj1273Drainage Ditches
  3. u-boot新增命令后出现data abort
  4. python装饰器带参数函数二阶导数公式_一文搞定Python装饰器,看完面试不再慌
  5. c语言 枚举类型 uint32_浅谈C语言枚举类型 | 附自创用法分享
  6. python中标识符的命名规则_Python——标识符的命名规则
  7. Oracle里silent,静默方式(silent)安装Oracle软件
  8. 【Java从入门到头秃专栏 6】语法篇(五) :多线程 线程池 可见、原子性 并发包 Lambda表达式
  9. getopt设计shell脚本选项
  10. Problem C: 01字串