頭條的文章和視頻支持定時發佈,那麼它的原理是什麼樣的呢,怎麼做到到了指定時間立即發佈,這其中用到了cron知識,它內部每秒都在掃描定時發佈的文章,直到你的文章的時間觸發條件,那麼就即可發佈。
SpringBoot定時任務
利用Spring自帶的定時任務,幾行代碼即可搞定這樣的需求
在方法中加入註解@Scheduled(cron = "0/1 * * * * ?")即可在指定的定時任務中執行對應的方法
cron是計劃執行任務的一種策略
Linux中的cron
Linux中自帶cron服務,但是這個服務默認沒有啟動,可以設置為自啟動。
Linux中的cron格式為M H D m d cmd,簡言之就是“分鐘 小時 自然月中的天 月 星期中的天 執行的命令”
它的最小單位是分鐘,所以正常來說是沒辦法執行秒級的任務,因此比如頭條的這種任務是無法執行的。
java中的cron
當然這種任務一般也不會用到Linux自帶的cron服務,一般我們都是用程序中的定時任務,cron表達式。
比如java中spring調用的jdk自帶的ScheduledExecutorService
cron表達式的格式是“秒 分 時 自然月的天 月 星期中的天 年”,可以根據這種策略執行秒級單位內的任何定時任務。
它的規則也是已經約束好的,比如
- 秒:0到59的數字,*,逗號,-,/
- 分:0到59的數字,*,逗號,-,/
- 時:0到23的數字,*,逗號,-,/
- 自然月的天:1到31的數字,*,逗號,-,/
- 月:1到12的數字,*,逗號,-,/
- 星期中的天:0到7的數字,*,逗號,-,/
其中
- *代表任何數字
- ,逗號代表多個數字的間隔符
- -代表從幾到幾
- /代表每隔多長時間觸發一次
- ?代表只在日期和星期字段中使用,它通常指定為“無意義的值”,相當於佔位符;
- L:代表“Last”的意思,但它在兩個字段中意思不同。L在日期字段中,表示這個月份的最後一天,如一月的31號,非閏年二月的28號;如果L用在星期中,則表示星期六,等同於7
- W:代表表示離該日期最近的工作日。比如15W表示離該月15號最近的工作日,如果該月15號是星期六,則匹配14號星期五;如果15日是星期日,則匹配16號星期一;如果15號是星期二,那結果就是15號星期二。
常見的任務類型:
- 每秒鐘執行一次:0/1 * * * * ?
這種常見於需要實時觸發的異步任務,這裡面的/就代表從0秒開始,每一秒執行一次。
- 有個需要注意的0/50 * * * * ?
從0秒開始每50秒執行一次,那麼它的執行時間就是0秒一次,50秒一次,緊接著下一秒的0秒一次,50秒一次,這樣他們之間的間隔並不完全是50秒,這裡指的是秒0到59的週期內,從0開始每50秒一次
- 每5分鐘執行一次:0 0/5 * * * ?
這裡呢秒是0,然後分鐘是從0開始每5分一次,也就是0分0秒一次,5分0秒1次依次類推
- 5 0/5 * * * ? 0分5秒一次,5分5秒1次依次類推
- * 0/2 * * * ? 0分內每秒一次執行60次,2分的時候每秒一次執行60次,依次類推
系統如果不需要集群的話,這種方式是最簡單快速的,但是當前大部分系統都需要集群,所以一般我們不會採用這種方案,而是用單獨定時任務分佈式集群系統,否則會造成任務重複執行。
閱讀更多 聊推 的文章