利用redis 分布式锁 解决集群环境下多次定时任务执行
定时任务:
@Scheduled(cron= "0 39 3 * * *")
public void getAllUnSignData(){
//检查任务锁,若其它节点的相同定时任务已经执行,则该节点的任务执行一个空任务,否则设置锁并执行该任务
String timerName = this.getClass().getName()+Thread.currentThread() .getStackTrace()[1].getMethodName();//当前类名+当前方法名
if(redisLock.requireLock(timerName,7200)){
return;
}
long startTime = System.currentTimeMillis();
logger.info("定时任务 UnSignStatistics start-->" + startTime );
//找出签到异常的学生,保存在表中
gxyWarnService.saveUnSignWarn();
long endTime = System.currentTimeMillis();
logger.info("定时任务 UnSignStatistics end-->" +endTime+ ", execute time: " + (endTime - startTime) + "ms" ); }
用类名+方法名作为key, 去redis 获取锁。
如果获取到了键值对: (key , 1) ,则说明定时任务已被执行,返回true , 执行if 中的return, 不执行 后面的定时任务。
如果没有获取到 键值对: (key , 1) ,则说明定时任务没有被执行 。在redis中 设置键值对 (key , 1), (并设置有效期7200秒,这个有效期小于定时任务的周期即可),并返回false 。不执行if 中的return,继续执行后面的定时任务代码。
@Component
public class RedisLock {
//redis中存任务锁的key前缀
public final static String MOGUDING_TIMER_LOCK_KEY = "com:lock:job:"; @Autowired
private RedisTemplate<String, Object> redisTemplate; /**
* 判断是否有锁。有,返回true;否,返回false,设置一定期效的锁
* @param lockName
* @param expire 锁的有效时间长,单位:秒
* @return
*/
public boolean requireLock(String lockName,long expire){
String key = MOGUDING_TIMER_LOCK_KEY+lockName;
if(redisTemplate.opsForValue().getAndSet(key,"1")==null){ //“1”这里无任何意义
redisTemplate.expire(key,expire,TimeUnit.SECONDS);
return false;
}else {
return true;
}
}
/**
* 判断是否有锁。有,返回true;否,返回false,设置一定期效的锁
* @param lockName
* @param date 锁的有效时间截止点
* @return
*/
public boolean requireLock(String lockName,Date date){
String key = MOGUDING_TIMER_LOCK_KEY+lockName;
if(redisTemplate.opsForValue().getAndSet(key,"1")==null){ //“1”这里无任何意义
redisTemplate.expireAt(key,date);
return false;
}else {
return true;
}
}
}
利用redis 分布式锁 解决集群环境下多次定时任务执行的更多相关文章
- 【SpringBoot】spring-session-data-redis 解决集群环境下session共享
为什么会产生Session共享问题 集群情况下,session保存在各自的服务器的tomcat中,当分发地址至不同服务时,导致sesson取不到,就会产生session共享问题. 解决方案 负载均 ...
- 在tomcat集群环境下redis实现分布式锁
上篇介绍了redis在集群环境下如何解决session共享的问题.今天来讲一下如何解决分布式锁的问题 什么是分布式锁? 分布式锁就是在多个服务器中,都来争夺某一资源.这时候我们肯定需要一把锁是不是 , ...
- 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存
原文:http://blog.csdn.net/heyewu4107/article/details/71009712 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存 问 ...
- 利用redis实现分布式事务锁,解决高并发环境下库存扣减
利用redis实现分布式事务锁,解决高并发环境下库存扣减 问题描述: 某电商平台,首发一款新品手机,每人限购2台,预计会有10W的并发,在该情况下,如果扣减库存,保证不会超卖 解决方案一 利用数据 ...
- 分布式集群环境下,如何实现session共享五(spring-session+redis 实现session共享)
这是分布式集群环境下,如何实现session共享系列的第五篇.在上一篇:分布式集群环境下,如何实现session共享四(部署项目测试)中,针对nginx不同的负载均衡策略:轮询.ip_hash方式,测 ...
- redis 与java的连接 和集群环境下Session管理
redis 的安装与设置开机自启(https://www.cnblogs.com/zhulina-917/p/11746993.html) 第一步: a) 搭建环境 引入 jedis jar包 co ...
- 分布式集群环境下,如何实现session共享一(应用场景)
在web应用中,由于http的请求响应式,无状态.要记录用户相关的状态信息,比如电商网站的购物车,比如用户是否登录等,都需要使用session.我们知道session是由servlet容器创建和管理, ...
- 分布式集群环境下,如何实现session共享四(部署项目测试)
这是分布式集群环境下,如何实现session共享系列的第四篇.在上一篇:分布式集群环境下,如何实现session共享三(环境搭建)中,已经准备好了相关的环境:tomcat.nginx.redis.本篇 ...
- 分布式集群环境下,如何实现session共享三(环境搭建)
这是分布式集群环境下,如何实现session共享系列的第三篇.在上一篇:分布式集群环境下,如何实现session共享二(项目开发)中,准备好了一个通过原生态的servlet操作session的案例.本 ...
随机推荐
- jade-mixin 代码的重用
有时候页面有好多个区块,比如列表区块,但是他们代码结构又是一模一样的怎么弄?jade天生就是节约成本,节约时间的,mixin就是让代码块可以重用的函数 mixin lession p jade s ...
- Paper Reading:Faster RCNN
Faster R-CNN 论文:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 发表时间: ...
- Java并发包--ConcurrentLinkedQueue
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3498995.html ConcurrentLinkedQueue介绍 ConcurrentLinkedQ ...
- C语言I 博客作业03
这个作业属于哪个课程 C语言程序设计II 这个作业要求在哪里 作业要求 我在这个课程的目标是 掌握关系运算.if-else语句.格式化输入语句scanf(),以及常用的数学库函数 这个作业在那个具体方 ...
- 11 - Vue模板语法
Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据. 所有 Vue.js 的模板都是合法的 HTML ,所以能被遵循规范的浏览器和 HTML ...
- BZOJ 3903 反垄断 (最大流推的结论题)
题目 中文题目,不解释: BZOJ传送门 分析 这道题BZOJ上也只有几个人过-奇怪了 下面是正解 原问题为一个二分图边染色问题.首先考虑最好情况.最理想情况的分配为:设一个点xxx的度为dgr(x) ...
- BZOJ 3576: [Hnoi2014]江南乐 (SG函数)
题意 有nnn堆石子,给定FFF,每次操作可以把一堆石子数不小于FFF的石子平均分配成若干堆(堆数>1>1>1). 平均分配即指分出来的石子数中最大值减最小值不超过111.不能进行操 ...
- python自动华 (十六)
Python自动化 [第十六篇]:JavaScript作用域和Dom收尾 本节内容: javascript作用域 DOM收尾 JavaScript作用域 JavaScript的作用域一直以来是前端开发 ...
- [Javascript] Create an Image with JavaScript Using Fetch and URL.createObjectURL
Most developers are familiar with using img tags and assigning the src inside of HTML. It is also po ...
- jquery的tap会执行2次的替换办法
用touchend替换 $(".videoCall").on("touchend",function(){ })$(".videoCall" ...