单机定时任务
通用
- 时间轮:多个环形队列,一个格子里面放一个任务,类似于时钟
- 高层的轮子只是计时,底层的轮子放任务,一个轮子是一个链表类似的,绑定多个任务。
- Kafka 等时间队列很多都有实现。
- 时间复杂度很低。
Java 专属
- Timer 类:内部使用
TaskQueue优先级队列的类存放定时任务,单线程; - ScheduledExecutorService接口实现类:线程池+优先队列;
- DelayQueue类:优先队列
- Spring Task:线程池,通过
@Scheduled注解即可定义,很简单。
推荐一个在线 Cron 表达式生成器:http://cron.qqe2.com/ 。 **
分布式定时任务
- Redis:
- Redis 过期事件监听和 Redission 内置延迟队列
- MQ:消息队列大多都支持定时投递消息。
- Quartz:
- Elastic-Job
- XXL-JOB
- PowerJob
