1.CRON
CRON表达式是用于设置定时任务执行时间的一种字符串格式。在计算机中,CRON表达式通常用于指定任务在何时执行的规则。它由多个时间字段组成,用空格隔开,每个时间字段代表任务在一个时间维度上的执行规则。
秒(0-59) 分钟(0-59) 小时(0-23) 日期(1-31) 月份(1-12) 星期(0-7,其中0和7都表示星期日)
其中,每个时间字段都可以是一个具体的值、一个范围、一个通配符(*),或者一个逗号分隔的列表。另外,还可以使用特殊字符来表示一些特殊的含义:
*
:代表所有可能的值,例如在分钟字段使用*
表示每分钟都执行。/
:用于指定增量步长,例如在小时字段使用0/2
表示每隔2小时执行一次。-
:用于指定范围,例如在月份字段使用1-6
表示1月到6月。,
:用于指定多个值,例如在星期字段使用1,3,5
表示周一、周三和周五。?
:用于指定不关心的值,通常用于日期和星期字段,表示不指定具体的值。
以下是一些CRON表达式的示例:
0 0 * * *
:每天零点执行一次。0 0 12 * * ?
:每天中午12点执行一次。0 0 8-18 * * MON-FRI
:每个工作日上午8点到下午6点,每隔1小时执行一次。0 0/30 * * * ?
:每隔30分钟执行一次。
在Java中,通常可以使用Spring的@Scheduled
注解来指定CRON表达式,从而实现定时任务的调度。
2.使用实例
@Slf4j
//开启定时任务
@EnableScheduling
@Component
public class KillJob {
@Resource
private KillService killService;
@Resource
private RedisTemplate redisTemplate;
@Scheduled(cron = "0 0/30 * * * ?")
private void init(){
log.debug("初始化秒杀商品到redis");
//查询秒杀活动商品
List<Kill> list = killService.partOfUse();
//缓存预热
for (Kill kill:list){
redisTemplate.opsForList().leftPush("kill:goods",kill);
for (int i = 0; i < kill.getNum(); i++) {
//存储每个活动对应商品数量的商品id,处理超卖的问题
redisTemplate.opsForList().leftPush("kill:num:"+kill.getId(),kill.getGid());
}
}
}
}