最近做一个网站,数据较多时,刷新数据比较慢。所以使用了Redis缓存优化,再使用定时任务,每隔一个小时刷新一次。
问题定时任务使用Quartz.Net,在调试时没有问题,但部署到服务器时,范围反而觉得更慢了。
一开始,还以为是Redis服务器的问题,还有时候访问很快,有时又很慢。
分析后面查看缓存日志,居然连续执行了几十次,有时执行十多次,有时执行二十多次,有点奇怪。又有一段时间稳定了,执行了60次,且是连续执行。
每刷新一次数据时间较长,至少10秒,多的要1分多钟,由于数据是由很多个客户端上传的,多个客户端上传数据到服务器时,刷新数据到Redis服务器,所花的时间就比较久。
需求是每小时刷新一次,但现在是每小时刷新,但是每小时刷新几十次,不正常,导致刷新缓存时,访问网站更卡。
处理在网上查了Quartz.Net多次触发的,发现很多人也踩坑了。后来发现原来是Cron表达式写错了,
我想要的结果是每小时的25分时执行一次,于是这样写,这样写是错的。
* 25 * * * ? *
这样表示,每小时25分的每秒执行一次,1分钟有60秒,于是执行了60次。
正确应该是
0 25 * * * ? *
表示,每小时25分的0秒执行一次
另外,还有一个问题,每次程序启动时,都会自动执行一次,这需要设置一下触发机制
//启动时,第一次不执行 ((CronTriggerImpl)trigger).MisfireInstruction = MisfireInstruction.CronTrigger.DoNothing;Cron表达式
- Cron表达式有7段构成,分为秒,分钟,小时时,日,月份,星期,年
- *(星号)是通配符,表示每秒,每分钟,每小时,每日等
- ,(逗号)可以列举执行的时间,比如 1,2,3 * * * * ? * 表示每分钟的1秒,2秒和3秒时执行一次
- -(横杆)表示范围,0 1-3 * * * ? * 表示每小时的1分钟到3分钟,每分钟执行一次
- /(斜杆)表示增量,0 0/5 10 * * ? * 表示每天的10点到10点55分,每5分钟执行一次
定时任务功能参考了开源项目YiShaAdmin的代码,YiShaAdmin开发文档
quartz.net 时间表达式----- Cron表达式详解 - 张龙豪 - 博客园
Quartz启动后第一次会立即执行问题解决办法 - Chr☆s - 博客园
在线Cron表达式生成器:JSON在线编辑器-奇Q工具网



