防止重复请求,解决:使用分布式锁,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);
        }


















