文章来源于个人 iteye blog http://ak478288.iteye.com/blog/1898190redis
之前为部门内部开发过一个定时器程序,这个定时器很简单,就是配置quartz,来实现定时调用配置的url功能。最近为了防止定时器所在的服务器因为特殊缘由挂掉,须要对定时器作多机部署。那么若是按照原来的方式进行部署,就会遇到 在必定的间隔时间内,可能出现屡次重复调用的问题。为了解决这个问题,我就借助了redis的分布式锁功能。服务器
redis分布式锁参考 : http://www.jeffkit.info/2011/07/1000/分布式
具体原理以下:测试
定时器到时间被触发,程序开始先争取一个redis锁。url
若是得到锁,就设置锁的超时时间为到下次定时器触发的时间。spa
而后执行定时器任务。后来的定时器也来尝试得到redis锁,固然,这个锁已不能获取了,并且超时时间在将来,因此就放弃此次任务调用。blog
定时器到时间再次被触发,而后尝试得到锁,因为锁的超时时间为定时任务的时间间隔,当前时间正好大于或等于超时时间,因此,程序能够顺利的得到锁,并重置超时时间。开发
。。。。。。。不断的循环调用,判断部署
在此之间测试循环间隔时间最小单位为1s最好,若是小于1s的调用,因为使用redis会有10几毫秒的运算耗费,所以不能保证在1s如下的时间间隔比较均匀.get
为了能保证定时触发时,能得到redis锁,能够设置锁的超时时间为间隔时间-10ms。这样就判断超时时间 now > timeoutTime = true。
补充:
只要多个服务器时间差异不大,基本不会有重复的问题。惟一担忧的就是redis,这个挂了,就全挂了。
所以,若是要考虑更全面,须要对redis点单再作集群。就看是否有必要了。
目前定时器的任务都是经过配置文件写好,之后我还要考虑动态更新任务。
目前代码还在整理中,想作一个开源的项目。