当前位置: 首页 > news >正文

redis分布式锁(看门枸机制)

分布式锁确保在同一时间只有一个节点能获得对共享资源的独占访问权限,从而解决并发访问问题。

Redisson锁(简称看门狗)

它可以实现锁的延长,确保某个线程执行完才能让其他线程进行抢锁操作

引入看门狗机制后

如何使用?

1、引入依赖包

<!--Redisson依赖-->
<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.31.0</version>
</dependency>

2、配置类Config

@Configuration //标明是配置类
public class RedissonConfiguration {/*注入到IOC容器中*/@Beanpublic RedissonClient redissonClient(){//1.创建配置对象Config config = new Config();// 集群模式//config.useClusterServers().addNodeAddress("集群ip1", "集群id2");//2.根据config创建出RedissonClient实例config.useSingleServer().setAddress("redis://192.168.21.131:6379");
​//返回 RedissonClient实例return Redisson.create(config);}
}

3、编写Controller类

@RestController
@Slf4j
@RequestMapping("/api")
public class LockController {@Autowiredprivate RedissonClient redissonClient;
​@PutMapping("/watch-dog")public String redissonLock() {RLock lock = redissonClient.getLock("anyLock");try {//尝试获取锁,tryLock参数分别是:获取锁的最大等待时间(期间重试) ,锁自动释放时间,时间单位
​//锁的获取时间(重试获得锁)为5秒,超过时间线程未结束会延长锁的获取时间,其他线程无法获得锁//boolean isLocked = lock.tryLock(5,10, TimeUnit.SECONDS);//不指定锁超时时间,锁会无限续期,直到获得锁的业务逻辑失败boolean isLocked = lock.tryLock(5, TimeUnit.SECONDS);
​if (isLocked) {log.info("获取锁成功"+Thread.currentThread().getName()+":开始睡觉");Thread.sleep(5*1000);log.info("获取锁成功"+Thread.currentThread().getName()+":睡5秒,");
​// 业务逻辑Thread.sleep(10*1000);log.info("获取锁成功"+Thread.currentThread().getName()+":睡眠10秒,超过请求获取锁的时间");} else {log.info("锁未释放{}获取锁失败",Thread.currentThread().getName());return "无法获取锁";}
​} catch (InterruptedException e) {e.printStackTrace();return "线程被中断";} finally {if (lock.isHeldByCurrentThread()) {lock.unlock();}}
​return Thread.currentThread().getName();}
}
​
​

4、代码效果

避雷点

关于finallly释放锁时的踩雷点

直接lock.unlock会导致Redisson抛出异常,这个异常的原因是因为,当多个请求进来时,由于一个线程在占用着锁,其他线程无法获得锁,他就会走到finally中,去释放锁,但是由于它本身不带锁,就会触发异常。

解决办法

在释放之前添加if判断

finally{if(lock.isHeldByCurrenThread()){lock.unlock();  }
}
lock.isHeldByCurrenThread(),用于判断当前锁是否是当`前线程持有的,如果是就释放锁,不是就不让它释放,可以避免线程抛出异常。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • linux如何对c++进行内存分析
  • Davinci 大数据可视化分析
  • 数字电子技术-编码器
  • gevent + flask 接口会卡住
  • Python--数据格式转换
  • 主流日志框架Logback与Log4j2
  • [Spring]Spring MVC 请求和响应及用到的注解
  • Call OpenAI API with Python requests is missing a model parameter
  • Stable Diffusion 使用详解(11)--- 场景ICON制作
  • (十六)、把镜像推送到私有化 Docker 仓库
  • 2024华为杯研赛E题保姆级教程思路分析
  • 打造民国风格炫酷个人网页:用HTML和CSS3传递民国风韵
  • 如何在Windows上安装Docker
  • 业务资源管理模式语言17
  • 如何通过蜂巢(容器安全)管理内部部署数据安全产品与云数据安全产品?
  • 《Java编程思想》读书笔记-对象导论
  • 【347天】每日项目总结系列085(2018.01.18)
  • 4. 路由到控制器 - Laravel从零开始教程
  • css系列之关于字体的事
  • gf框架之分页模块(五) - 自定义分页
  • isset在php5.6-和php7.0+的一些差异
  • Java多线程(4):使用线程池执行定时任务
  • JS+CSS实现数字滚动
  • laravel 用artisan创建自己的模板
  • linux安装openssl、swoole等扩展的具体步骤
  • MySQL QA
  • node-glob通配符
  • 阿里研究院入选中国企业智库系统影响力榜
  • 程序员该如何有效的找工作?
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 关于extract.autodesk.io的一些说明
  • 回顾2016
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 力扣(LeetCode)357
  • 聊聊flink的TableFactory
  • 软件开发学习的5大技巧,你知道吗?
  • 一起参Ember.js讨论、问答社区。
  • C# - 为值类型重定义相等性
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​14:00面试,14:06就出来了,问的问题有点变态。。。
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (3)选择元素——(17)练习(Exercises)
  • (MATLAB)第五章-矩阵运算
  • (二)pulsar安装在独立的docker中,python测试
  • (二十六)Java 数据结构
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (回溯) LeetCode 131. 分割回文串
  • (三)mysql_MYSQL(三)
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (转) RFS+AutoItLibrary测试web对话框
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .net core 外观者设计模式 实现,多种支付选择
  • .net framework profiles /.net framework 配置
  • .net 发送邮件