当前位置: 首页 > 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(),用于判断当前锁是否是当`前线程持有的,如果是就释放锁,不是就不让它释放,可以避免线程抛出异常。


http://www.mrgr.cn/news/31297.html

相关文章:

  • AI大模型之旅-langchain结合glm4,faiss构建本地知识库
  • 《C++中的资源管理利器:RAII 技术深度剖析》
  • 【busybox记录】【shell指令】stdbuf
  • 东北非国企就职体验
  • 2409js,学习js1
  • Linux 系统进程理解——标识符,状态
  • 将阮一峰老师的《ES6入门教程》的源码拷贝本地运行和发布
  • 滑动窗口(8)_最小覆盖字串
  • 震撼揭秘:2024年企业最受欢迎的IM即时通讯工具全面分析!
  • opengl-redbook环境搭建(静态库)
  • 封装一个录音声音振动效果的组件
  • 【iOS】——YYModel源码总结
  • 如何编写一个爬虫以实时获取某平台商品价格
  • Linux——K8s集群部署过程
  • 天宝Trimble RealWorks2024.0.2注册机 点云后处理软件 点云三维重建软件
  • 解决Rdkit Explicit valence for atom # 1 C, 5, is greater than permitted,价键不对的问题
  • 倒排索引(反向索引)
  • 数据结构—(java)反射,枚举,lambda表达式
  • 如何在C++中使用Poppler库读取PDF文件(一)
  • Web开发:ABP框架3——入门级别的接口增删改查实现原理