做到一个项目,客户要求需要部署多套服务,避免发生故障时无法使用系统。
系统中包含定时任务来处理一些业务,是用注解@Scheduled 来实现的。
这样的话,在部署多个服务时就会出现每一个服务都跑一次定时任务的情况。
为了所有的服务运行时,只会跑一次定时任务。查找资料可以使用redis来实现锁,让所有的服务去争抢一个锁,谁抢到了谁就来跑定时任务。
在 Redis 中, SETNX 命令是可以帮助我们实现互斥。SETNX
即 SET if Not eXists (对应 Java 中的 setIfAbsent 方法),如果 key 不存在的话,才会设置 key 的值。如果 key 已经存在, SETNX
啥也不做。
Java 中 setIfAbsent 方法,如果key不存在,则设置值,并且返回true。如果key存在,则返回false。
这个方法内部调用的是setnx的,用的redis依赖是2.6.3,查找资料redis是在2.6.12版本中,为set命令加入了新的参数,使该命令直接支持了分布式锁。
那么就可以通过这个方法来实现了。以下是实现的主要逻辑
这个实现是有缺陷的,有可能会出现方法还没有执行完,锁已经释放了的情况。而这个时候又有新一轮争抢锁的事件发生,就会出现问题。这个可以通过给锁续期来实现,这个后面再学习吧。