这篇文章主要介绍了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代码如下: 希望本文所述对大家学习有所帮助,谢谢大家的阅读。