问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

基于注解的redis分布式锁的简单实现

发布网友 发布时间:2024-09-11 14:17

我来回答

1个回答

热心网友 时间:2024-10-21 00:46

分布式锁的应用场景还是比较多的,然后手头的项目没有有效的封装,然后忙里偷闲,简单封装了一下。

分布式锁的实现方式还是很多,比较多的肯定就是Redis和zk了,现有的项目只有redis,所以以下的分布式锁是基于redis实现的了。

直接上代码吧:

@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceRedisLock{//支持SPEL表达式和普通的keyString[]keys();//等待获取锁的时间longtimeout()default3000L;}/***开启redis分布式锁注解*/@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@ImportAutoConfiguration({LockAop.class})public@interfaceEnableRedisLock{}@Order(Integer.MIN_VALUE)@AspectpublicclassLockAop{privatestaticLoggerlogger=LoggerFactory.getLogger(LockAop.class);publicLockAop(RedissonClientredissonClient){this.redissonClient=redissonClient;logger.info("LockAop初始化完成!");}@Pointcut("@annotation(com.bosssoft.nontax3.saas.billCollection.collect.api.common.anno.RedisLock)")publicvoidpointCut(){}privateRedissonClientredissonClient;//获取被拦截方法参数名列表(使用Spring支持类库)ASM机制故定义为常量privatestaticfinalLocalVariableTableParameterNameDiscovererU=newLocalVariableTableParameterNameDiscoverer();//使用SPEL进行key的解析线程安全所以可复用privatestaticfinalExpressionParserPARSER=newSpelExpressionParser();@Around("pointCut()")publicObjectaround(ProceedingJoinPointpoint)throwsThrowable{RLocklock=null;booleanflag=false;try{MethodSignaturesignature=(MethodSignature)point.getSignature();Methodmethod=signature.getMethod();RedisLockredisLock=method.getAnnotation(RedisLock.class);finalString[]keys=redisLock.keys();finallongtimeout=redisLock.timeout();if(keys.length>0){finalStringprefix=getPrefix(keys,method,point.getArgs());lock=redissonClient.getLock(prefix);finallongl=System.currentTimeMillis();while(true){//尝试获取锁,获取失败等待一会flag=lock.tryLock();if(flag){break;}//等待一会不要尝试那么快sleep();finallongj=System.currentTimeMillis();if(j-l>timeout){break;}}}if(flag){returnpoint.proceed();}else{thrownewBusinessException(LOCK_ERROR);}}finally{if(flag&&lock!=null){try{if(lock.isLocked()){if(lock.isHeldByCurrentThread()){lock.unlock();}}}catch(Exceptione){logger.error("lock解锁失败",e);}}}}privatevoidsleep(){try{Thread.sleep(100L);}catch(InterruptedExceptione){logger.error("中断异常",e);}}privateStringgetPrefix(String[]keys,Methodmethod,Object[]args){StringBuilderbuilder=newStringBuilder();for(Stringkey:keys){if(key.startsWith("#")){builder.append(parseKey(key,method,args)).append(":");}else{builder.append(key).append(":");}}returnbuilder.toString();}/***获取spel的具体值**@return具体的前缀*/privateStringparseKey(Stringkey,Methodmethod,Object[]args){if(StringUtils.isEmpty(key)){returnnull;}String[]paraNameArr=U.getParameterNames(method);//SPEL上下文StandardEvaluationContextcontext=newStandardEvaluationContext();//把方法参数放入SPEL上下文中for(inti=0;i<Objects.requireNonNull(paraNameArr).length;i++){context.setVariable(paraNameArr[i],args[i]);}returnPARSER.parseExpression(key).getValue(context,String.class);}

只实现了一些基本功能,然后使用了Spring的spel表达式,接来下来看看使用吧

@RedisLock(keys={"#sortTransfer.agencyIdCode","#sortTransfer.directoryCode","save"})publicvoidsaveData(SortTransfersortTransfer){//Dosomething、、、}

spel表达式可以直接解析,这样使用就很便利了。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...正常的情况下可以接种乙肝疫苗吗?怎么接种? ...医院两种说法,谁的对啊 ,我是乙肝携带者吗,可以用疫苗吗_百度... 一本征集志愿一定要上了一本线吗?比一本线少一分想报一本专业怎么... 没到一本分数线能填征集志愿吗? 户外摄影必备器材有哪些 微信扫码后能查看记录吗? 关于E照和C照的问题,急!! 驾照转籍注销问题 我2010年考的摩托车E照,没有去领驾驶证,现在人在外地,我能在当地补_百 ... 春夜洛城闻笛中,为什么"折柳"二字是全诗的关键 贴对联怎么贴是正确的 微信视频号的直播预告可以修改时间吗? 煮姜枣茶的正确做法 夏季姜枣茶的配方和制作方法 72岁老人血糖八点几每天早上吃小米,黑豆,黑米,薏仁,核桃,鸭蛋等这样打... 西伯利亚是中国的领土 华为手机字体如何设置简体中文繁体中文? 洛阳的二甲医院有哪些医院 洛阳市二甲医院有哪些 洛阳二级医院有哪些 结石到输尿管有什么症状 结石在输尿管末端症状 结石到输尿管末端症状 肾结石掉到输尿管末端怎么办 尿结石快掉出来的症状 肾结石到输尿管末端怎么办 输尿管结石快出来的症状 结石到输尿管末端怎么办 女性的肾结石排出去有什么感觉 虚拟号码有哪些? 安室透喜欢的女生是谁 AOP+SPel+Redis实现分布式锁的切面 赤壁悬流风景区能玩几小时,太行赤壁悬流景区门票 赤壁悬流景区是哪条河_平顺至潞城的公交车 光芒剧情介绍光芒主要演员介绍 肋间隙可有压痛的检查 MacBook pro有没有能装的免费的杀毒软件?担心中毒了咋办啊? 胸椎错位怎么检测 选购宝宝奶粉盒的必要性有哪些? 胸椎小关节错位有什么症状 进口奶粉分装什么意思 胸摊关节紊乱的临床表现 胸椎病常见的临床表现 江淮骏铃更换空调滤芯的步骤是什么? 苹果手机如何将照片导入电脑? 什么叫净资 小红书关注界面变成竖屏是什么原因? 别讨论了,李约瑟难题的标准答案来了!看看和你的答案一样吗 精神堡垒设计 教材中增加英雄故事的意义是什么?