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

分布式锁:业务锁和定时任务锁

一:业务锁

在代码业务逻辑加锁,防止不同业务操作相同业务表导致数据错乱,设置锁进行等待。这里锁使用的是ReentrantLock。详细的介绍可以参考:
https://blog.csdn.net/jerry11112/article/details/112375167

@Slf4j
public class MyLock {private static ConcurrentHashMap<Long, ReentrantLock> reenTranLock = new ConcurrentHashMap<>();/*** 业务加锁* @param businessId        业务id* @param lockCode          需要加锁的代码,执行完后自动解锁* @param timeOutSeconds    锁超时时间* @return**/public static <T> T lockAndUnLock(Long businessId, Supplier<T> lockCode, long timeOutSeconds) {try {//可重入公平锁:true-公平锁,false-非公平锁ReentrantLock lock = reenTranLock.putIfAbsent(businessId, new ReentrantLock(true));lock = lock != null ? lock : reenTranLock.get(businessId);//超时加锁,单位秒boolean lockSuccess = lock.tryLock(timeOutSeconds, TimeUnit.SECONDS);if (lockSuccess) {try {return lockCode.get();} catch (Exception ex) {throw ex;} finally {//解锁lock.unlock();}} else {throw new Exception("操作失败");}} catch (Exception ex) {if (ex instanceof IllegalStateException) {throw new IllegalStateException(ex.getMessage());}throw new RuntimeException(ex);}}/*** 加锁和解锁默认60S超时* @param businessId    业务id* @param lockCode      需要加锁的代码,执行完后自动解锁* @return**/public static <T> T lockAndUnLock(Long businessId, Supplier<T> lockCode) {return lockAndUnLock(businessId, lockCode, 60);}public static void main(String[] args) {Boolean a = lockAndUnLock(1L, () -> {String aaa = "111111";return true;});System.out.println(a);}
}

二:定时任务锁

当多个负载服务同时启用相同程序定时任务,需加上分布式锁,这里使用的是redis加锁。

@Slf4j
public class TaskTest {@Autowiredprivate RedisTemplate redisTemplate;@Scheduled(cron = "0 0/10 * * * ?")public void task() {//redis key名称String redisKey = "test".concat(":").concat(this.getClass().getSimpleName()).concat("task");//加上redis锁,适应分布式场景boolean setOk = redisTemplate.opsForValue().setIfAbsent(redisKey, redisKey, 10, TimeUnit.SECONDS);  //单位秒:根据不同的业务处理,自行设置大小时间if (!setOk) {log.info(redisKey + "任务已执行");return;}try {//业务逻辑处理.....} catch (Exception ex) {log.error("定时任务异常", ex.getMessage());} finally {//手动解锁redisTemplate.delete(redisKey);}}
}
http://www.lryc.cn/news/146063.html

相关文章:

  • 路由器的简单概述(详细理解+实例精讲)
  • Mapper.xml文件解析
  • ES 7.6 - JAVA应用基础操作篇
  • com.squareup.okhttp3:okhttp 组件安全漏洞及健康度分析
  • 【Unity的HDRP渲染管线下用Steam VR串流结合使用遇到的各种问题_SteamVR 插件和Pico串流助手】
  • Unity——音乐、音效
  • Ubuntu 23.10 将首次推出基于 Flutter 的新 Ubuntu 商店
  • linux scatterlist阅读三
  • 2023新,centos7安装mysql8.0.25
  • Data Rescue Professional for Mac:专业的数据恢复工具
  • 新手小白想要做好跨境电商独立站,需要考虑哪些要素?
  • Consul原理介绍
  • 【C++实战】C++实现贪吃蛇(含源代码)—基于easyx图形库
  • PHP获取两个日期之间的所有日期
  • STL之stack(适配器讲解以及双端队列的讲解)
  • JVM解密: 解构类加载与GC垃圾回收机制
  • 【Spring Boot】Spring Boot结合MyBatis简单实现学生信息管理模块
  • 【Java List与Map】List<T> Map与Map List<T>的区别(126)
  • 【FreeRTOS】常用函数总结
  • The Cherno——OpenGL
  • linux中学习控制进程的要点
  • C++Qt QSS要注意的坑
  • LeetCode每日一题:56. 合并区间(2023.8.27 C++)
  • 电视盒子什么牌子好?经销商整理线下热销电视盒子品牌排行榜
  • JavaScript关于函数的小挑战
  • 机器学习深度学习——针对序列级和词元级应用微调BERT
  • 重启Mysql时报错rm: cannot remove ‘/var/lock/subsys/mysql‘: Permission denied
  • [C/C++]指针详讲-让你不在害怕指针
  • 无涯教程-Android - Frame Layout函数
  • docker desktop安装es 并连接elasticsearch-head:5