Golang-定时任务之cron

在开发数据组件的过程中遇到了一个场景:通过redis缓存了一些数据操作,需要定时的将数据落地,这个时候就想到了使用Linux中的crontab,但遇到问题是,这个要执行的数据落地需要使用组件进程的一些内存数据,所以只能在当前进程下完成定时任务,没有办法使用系统级别的进程定时。

cron包

地址是:github.com/robfig/cron,它的优点就是可以在当前进程跑某个goroutine,而且可以精确到秒。

实例

package main

import (
"github.com/robfig/cron"
"log"
)

func main() {
i := 0
c := cron.New()
spec := "0 10,20,30,40,50 * * * ?"
c.AddFunc(spec, func() {
i++
log.Println("cron running:", i)
})
c.Start()

select{}
}

输出结果:

启动后输出如下:

2018/06/25 18:00:00 cron running: 1
2018/06/25 18:10:00 cron running: 2
2018/06/25 18:20:00 cron running: 3
2018/06/25 18:30:00 cron running: 4
2018/06/25 18:40:00 cron running: 5

格式

基础格式

在cron中,最关键的是一个字符串,他包括了6个参数,并用空格隔开。

字段含义 必须 值范围 特殊字符
秒(Seconds) 0-59 * / , -
分(Minutes) 0-59 * / , -
时(Hours) 0-23 * / , -
日(Day of month) 1-31 * / , - ?
月(Month) 0-12 or JAN-DEC * / , -
星期(Day of week) 0-6 or SUM-SAT * / , - ?

注:字母不区分大小写

特殊字符

  • 星号(*) 表示 cron 表达式能匹配该字段的所有值。如在第5个字段使用星号(month),表示每个月

  • 斜线(/) 表示增长间隔,如第1个字段(minutes) 值是 3-59/15,表示每小时的第3分钟开始执行一次,之后每隔 15 分钟执行一次(即 3、18、33、48 这些时间点执行),这里也可以表示为:3/15

  • 逗号(,) 用于枚举值,如第6个字段值是 MON,WED,FRI,表示 星期一、三、五 执行

  • 连字号(-) 表示一个范围,如第3个字段的值为 9-17 表示 9am 到 5pm 直接每个小时(包括9和17)

  • 问号(?) 只用于日(Day of month)和星期(Day of week),\表示不指定值,可以用于代替 *

END