首页 > 编程知识 正文

redisson连锁,redisson分布式锁是阻塞的吗

时间:2023-05-04 21:32:49 阅读:153018 作者:3609

带注释的redisson分布式锁定原理概述应用场景引入使用依赖于注释创建的剖切平面创建参考

原理概要

利用aop特性,制作包围片并注释的方法主体,每次执行该方法时,首先进入片并锁定,执行结束后返回片并解除锁定。

redisson本身支持redis群集部署,但redisson的缺点是,如果线程a成功锁定主节点,则两个主节点将异步复制到slave节点,此时仍为slave节点

如果应用了场景的分布式部署,则如果一个服务器启动多个实例,则必须对同一数据进行操作。

由于定时任务没有单独分离一个服务,而且定时任务所在的服务启动了多个实例,因此必须确保定时任务只在一个实例上运行。

引入依赖! 引进redisson的springboot启动器- -! -版本需要特别注意。 在mvn仓库中,redisson支持的starter-data-redis版本此次使用的starter-parent为2.1.3.RELEASE,最高支持3.9.1。 主要符合redis的版本dependencygroupidorg.redis son/groupidartifactidredisson-spring-boot-starter/artifactidversion3.9 --aop切面依赖----dependencygroupidorg.spring framework.boot/groupidartifactidspring-bot-starttttt ependencydependencygroupidorg.spring framework.boot/groupidartifactidspring-boot-starter-data-redis/artifact id

package com.ai.sx.modules.yiti Ji.annotation; import Java.lang.annotation.element type; import Java.lang.annotation.retention; import Java.lang.annotation.retention policy; import Java.lang.annotation.target; @target(elementtype.method ) retention ) retentionpolicy.runtime ) public@interfaceredislock(/锁的名称String lockName ////锁定过期时间,默认3秒,单位秒长时间() default 3; )创建切面进入切面后,如果锁定成功则执行任务,如果锁定失败则不执行任何操作。

具体锁定失败是需要循环尝试锁定,还是需要中断,需要修正切断面的逻辑;

如果需要在循环中锁定,请使用do…while循环尝试该循环。 为了缓解redis压力并降低多个线程获取锁定的可能性,可以在每次锁定失败后使线程休眠一段时间。

package com.ai.sx.modules.yiti Ji.aspect; import com.ai.sx.modules.yiti Ji.annotation.redis lock; importorg.AspectJ.lang.proceeding join point; importorg.AspectJ.lang.annotation.around; importorg.AspectJ.lang.annotation.aspect; import org.redisson.api.RLock; importorg.redis son.API.redisson client; importorg.spring framework.beans.factory.annotation.auto wired; importorg.spring framework.stereotype.com ponent; import Java.util.concurrent.time unit; @ aspect @ componentpublicclassredissonlockaspect { @ autowiredprivateredissonclientredissonclient; @around('@annotation(redislock ) ) (publicobjectaround ) proceedingjoinpointjoinpoint,RedisLock redisLock ) throws throws } stringlockname=redis lock.lock name (; long lease time=redis lock.lease time (; rocklock=redissonclient.get lock (lock name; 对象结果=null; lock.trylock (0,leaseTime,TimeUnit.SECONDS ) ) try ) /运行方式result=joinPoint.proceed ); (Finally ) if )锁定!=null lock.isheldbycurrentthread () ) { lock.unlock ); } }返回结果; enable使用模拟临时目录的计划删除的计划任务来控制是否运行计划任务。

package com.ai.sx.modules.yiti Ji.task; import com.ai.sx.modules.yiti Ji.annotation.redis lock; import lombok.extern.slf4j.slf4j; importorg.Apache.com mons.lang3. string utils; importorg.spring framework.beans.factory.annotation.value; importorg.spring framework.scheduling.annotation.scheduled; importorg.spring framework.stereotype.com ponent; import java.io.File; @ component @ sl F4 jpublicclassimagetask { @ value (' $ { yiti Ji.img.base.path } ) private String IMG_BASE_PATH; @ redis lock (lock name=' deletedimagestask ',enable='0' ) scheduled ) cron='0/5****? )公共语音删除任务() if (! string utils.is blank (img_base_path ) (filefile=newfile ) img _ base _ path ); if(file.exists () ) for (filef : file.list files ) ) deletefiles ); } } privatevoiddeletefiles (file file ) if ) file.isdirectory ) { File[] files=file.listFiles ); 文件:文件删除文件(for ) f; }if(file.delete () ) log.info (file.getabsolutepath ) ) '已被删除); } else { log.info (file.getabsolutepath )“删除失败”); }}参考阅读注释式redisson分布式锁定

Redis锁定机制的几种实现方法

Redis分布式锁的正确实现方法研究

Redission分布式锁定原理

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。