在开发数据组件的过程中遇到了一个场景:通过redis缓存了一些数据操作,需要定时的将数据落地,这个时候就想到了使用Linux中的crontab,但遇到问题是,这个要执行的数据落地需要使用组件进程的一些内存数据,所以只能在当前进程下完成定时任务,没有办法使用系统级别的进程定时。
cron包
地址是:github.com/robfig/cron
,它的优点就是可以在当前进程跑某个goroutine,而且可以精确到秒。
实例
package main |
输出结果:
启动后输出如下: |
格式
基础格式
在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