Springboot结合Redis实现分布式定时任务
一、背景
之前分享过分布式定时任务的技术选型方案:分布式定时任务技术选型方案,个人青睐xxl_job,分享了搭建接入流程:xxl_job搭建方案,本次项目需求较为简单,同时时间紧张。下面介绍利用Redis锁实现分布式定时任务的方案。
二、@Scheduled注解
1. 利用@Scheduled注解实现定时任务,源码如下
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {String cron() default "";String zone() default "";long fixedDelay() default -1;String fixedDelayString() default "";long fixedRate() default -1;String fixedRateString() default "";long initialDelay() default -1;String initialDelayString() default "";}
2. 注解参数
3. 示例
cron
@Scheduled(cron = "0/2 * * * * ?")
从0秒开始,每隔两秒执行一次。
zone
@Scheduled(cron = "0/2 * * * * ?", zone = "GMT-8:00")
从0秒开始,每隔两秒执行一次。
指定时间使用的时区为东八区。
fixedRate
@Scheduled(fixedRate = 1000)
1秒执行一次,上次执行开始后过1秒执行下一次。若到了1秒后但上次执行还未完成,会加入worker队列,等待上一次执行完成后,马上执行下一次。
fixedRateString
@Scheduled(fixedDelayString = "1000")
@Scheduled(fixedDelayString = "PT1S")
都表示1秒执行一次,上次执行开始后过1秒执行下一次。若到了1秒后但上次执行还未完成,会加入worker队列,等待上一次执行完成后,马上执行下一次。
fixedDelay
@Scheduled(fixedDelay = 1000)
秒执行一次,上次执行完成后过1秒继续执行下一次。
fixedDelayString
@Scheduled(fixedDelayString = "1000")
@Scheduled(fixedDelayString = "PT1S")
都表示1秒执行一次,上次执行完成后过1秒继续执行下一次。
initialDelay
@Scheduled(initialDelay = 5000, fixedRate = 2000)
首次5秒后执行,后续每隔2秒执行一次(遵循fixedRate 规则)
@Scheduled(initialDelay = 5000, fixedDelay = 2000)
首次5秒后执行,后续每隔2秒执行一次(遵循fixedDelay 规则)
注意:initialDelay、initialDelayString都不能和cron一起使用
initialDelayString
@Scheduled(initialDelayString = "5000", fixedRate = 2000)
首次5秒后执行,后续每隔2秒执行一次(遵循fixedRate 规则)
@Scheduled(initialDelayString = "5000", fixedDelay = 2000)
首次5秒后执行,后续每隔2秒执行一次(遵循fixedDelay 规则)
注意:initialDelay、initialDelayString都不能和cron一起使用
三、实现代码
1. 引入Redis
<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.13.5</version>
</dependency>
2. 定时任务执行类代码
@Scheduled(cron = "0 0 23 * * ?")public void statistics() {RLock lock = redissonClient.getLock("cron_statistics");boolean lockResult = false;try {if (lockResult = lock.tryLock()) {log.info("每天23点执行一次任务开始!");}} catch (Exception e) {e.printStackTrace();log.error("每天23点执行一次任务失败{}", e);} finally {if (lock.isHeldByCurrentThread() && lockResult && lock != null) {lock.unlock();}}}
3. 启动类增加注解
@EnableScheduling
如果有帮助,请多多点赞关注支持哦
Springboot结合Redis实现分布式定时任务相关推荐
- springboot整合redis实现分布式锁思想
思路 所有响应获取锁的线程都先尝试往redis中创建一个缓存数据,所有线程的key必须相同.使用的是redis的setnx命令.就只有一个线程能够创建成功,创建成功的线程就成功获取锁. 没有获取锁的线 ...
- spring boot基于redis的分布式定时任务
第一步. 自动配置类 主启动类添加:@EnableScheduling //开启定时任务 aop和redis POM添加: <!--redis驱动--><dependency> ...
- 借助redis实现分布式定时任务锁
场景说明:当前系统是分布式的,工程中有定时任务,要求同一时间只有一个任务出发执行,也不要都在一个部署的服务执行. 技术引用:redisson 3.17.7.spring boot 2.2.5 核心代码 ...
- Elastic-job实现分布式定时任务
Elastic-job实现分布式定时任务 前言 最近接了一个新的需求,需要使用到定时任务,由于我们的系统是分布式的,所以Spring自带的定时任务无法满足我们当前系统对定时任务的需要.我们需要一个能够 ...
- SpringBoot(46) 整合ShedLock实现分布式定时任务(redis版)
文章目录 一.前言 二.SpringBoot整合ShedLock 1.`pom.xml`中引入依赖 2.Shedlock配置类 3.测试数据定时任务 三.本文案例demo源码 一.前言 本文将基于sp ...
- Java基于redis实现分布式锁(SpringBoot)
前言 分布式锁,其实原理是就是多台机器,去争抢一个资源,谁争抢成功,那么谁就持有了这把锁,然后去执行后续的业务逻辑,执行完毕后,把锁释放掉. 可以通过多种途径实现分布式锁,例如利用数据库(mysql等 ...
- 基于Redis实现分布式锁,避免重复执行定时任务
Spring提供了定时任务的功能,但是在多个实例的集群中,会出现定时任务重复执行多次的情况. 使用Qutaz框架自带的分布式定时任务可以很好的解决这个问题,但是讲道理功能有些过于强大,对于需求不高,乃 ...
- 【redis】分布式锁实现,与分布式定时任务
如果你还不知道redis的基本命令与基本使用方法,请看 [redis]redis基础命令学习集合 写在前面 redis辣么多数据结构,这么多命令,具体一点,都可以应用在什么场景呢?用来解决什么具体的问 ...
- redis实现轮询算法_Dcron:基于redis与一致性哈希算法的分布式定时任务库
背景 最近项目中的定时任务越来越多,为了防止任务重复执行曾经使用过的方案: 只启用了一个节点. 固定循环间隔,使用分布式事务锁. 部署一套分布式任务调度系统. 方案一 没有容错机制,当单个节点宕机,所 ...
- 使用redis分布式锁+lua脚本实现分布式定时任务控制demo
2019独角兽企业重金招聘Python工程师标准>>> 分布式系统经常要遇到定时任务执行的问题,不能重复执行,但很多时候又不能统一到一个微服务里面,因为这样就失去了微服务的意义.由于 ...
最新文章
- s9.16作业,员工信息表
- vmware虚拟机异常关闭处理
- 用 WEKA 进行数据挖掘,第 2 部分: 分类和群集
- LeetCode刷题知识总结
- Struts2、SpringMVC、Servlet(Jsp)性能对比 测试 。 Servlet的性能应该是最好的,可以做为参考基准,其它测试都要向它看齐,参照...
- [脚本收集]提取Tripntale图片
- Xiki Shell Kickstarter,HummingBoard计算机等
- Tensor:Pytorch神经网络界的Numpy
- flask 加载配置文件
- HDU 5586 Sum (预处理 + 动态规划)
- Python词频统计(去重)
- IDEA使用教程(一)
- yuv422,yuv420,yuv444的区别
- 复制文字到剪贴板的几种方法
- MATLAB的卡尔曼滤波函数与实例
- WML语言基础(WAP建站)三
- zemax光学设计高阶优化
- 基于python-opencv给图像添加水印
- 朝花夕拾:Java中实现对EXCEL文件的读取
- Autodesk Alias AutoStudio 2022.1 x64