1.定时任务
定时任务可能会遇到的问题
1.任务执行得太快,执行完后就解锁的话,因为两台服务器时间可能差几百毫秒,所以还是会触发两次
通常的分布式锁
String value = String.valueOf(snowflakeConfig.snowflakeId());
try {
boolean lock = redisService.lock(Key, value, 加锁超时时间, 重试次数);
if (lock) {
log.info("job start ...");
//所执行的方法
log.info("job end ...");
}
} finally {
redisService.unlock(Key, value);
}
不解锁等超时后在解锁的分布式锁
去掉finally
2.业务中的分布式锁
有些功能我们只希望一个串行操作,同时操作也可以只需要重新进入方法
public void contractOperate() {
String value = String.valueOf(snowflakeConfig.snowflakeId());
boolean lock = redisService.lock(Key, value, 加锁超时时间, 重试次数);
if (lock) {
return operate(value);
}
try {
Thread.sleep(睡眠时间);
} catch (InterruptedException e) {
log.errer("sleep errer {}", e);
}
return contractOperate();
}
private void operate(String value) {\
try{
//实际要处理的业务
}
finally {
redisService.unlock(Key, value);
}
}
相当于在实际要处理的业务上套了一个分布式锁,没有锁的用户睡眠两面再次进入方法获取锁。