时钟跳跃对于系统运行来说是一个严重的问题,尤其是对于时钟敏感的实时业务来说,一个小小的时钟跳跃就可能造成实时业务功能的异常、程序崩溃。因此,为了保护实时业务,我们需要一种稳定可靠的技术来保护实时业务免受时钟跳跃的影响,这里我们介绍一种使用Redis来保护实时业务的可行方案。
我们在Redis中添加一个特殊的键值对”time-jump”,该键值对的值会随着系统时间更新,例如:
`Set(“time-jump”,System.currentTimeMillis());`
在系统启动或者重新部署时,我们可以获取Redis里”time-jump”就可以获取系统当前的时间,比如:
`long systemTime=Long.valueOf(Redis.get(“time-jump”));`
然后,在实时业务的开发中,使用systemTime作为标准的时间,而不是系统的本地时间,从而保证实时业务的正确运行,并且可以很好的防止时钟跳跃,例如:
`if(systemTime-startTime>10s){//do something}`
要更新Redis的”time-jump”,可以采用定时任务的方式每隔固定时间,更新一次Redis中的”time-jump”值,例如:
`ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
service.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
Redis.set(“time-jump”,System.currentTimeMillis());
}
},0,1,TimeUnit.MINUTES);`
以上就是使用Redis保护实时业务免受时钟跳跃带来的影响的一种可行方案,它可以实时地更新系统时间,并且可以实时地阻止时钟跳跃对实时业务的干扰,以最大程度的保护实时业务的正常运行。通过使用Redis,既可以降低系统的运维成本,又能有效的保护实时业务。