防止重复请求,解决:使用分布式锁,redisson,简单实例
通常情况下:synchronize在单机下是可以的,在分布式下不适用,nginx做分发到了不同的服务器后,不同的jvm是锁不住的,这样会出现超买问题。
2.使用redis中的setnx实现分布式锁
String creditSingleSignLockKey="业务id";
try{
Boolean result=stringRedisTemplate.opsForValue().setIfAbsent(creditSingleSignLockKey,creditSingleSignLockKey,30, TimeUnit.SECONDS);
if(!result){
throw new RuntimeException("请勿重复点击");
}
//业务代码
//业务代码
//业务代码
}finally {
//业务执行结束将该业务id重redis中移除
stringRedisTemplate.delete(creditSingleSignLockKey);
}
需要注意的是,一定要try catch final 并设置失效时间 否则,在业务中报错时,代码直接弹出,没有及时清理redis中的数据,就会出现死锁,下次再点击也进不来。
也可以通过redisson实现
String creditSingleSignLockKey="业务id";
RLock lock = redisson.getLock(creditSingleSignLockKey);
try{
lock.lock();
//Boolean result=stringRedisTemplate.opsForValue().setIfAbsent(creditSingleSignLockKey,creditSingleSignLockKey,30, TimeUnit.SECONDS);
if(!result){
throw new RuntimeException("请勿重复点击");
}
}finally {
lock.unlock();
//stringRedisTemplate.delete(creditSingleSignLockKey);
}