防止重复请求,防止重复点击,解决:使用分布式锁,redisson,setnx简单实例

防止重复请求,解决:使用分布式锁,redisson,简单实例

通常情况下:synchronize在单机下是可以的,在分布式下不适用,nginx做分发到了不同的服务器后,不同的jvm是锁不住的,这样会出现超买问题。

2.使用redis中的setnx实现分布式锁
防止重复请求,防止重复点击,解决:使用分布式锁,redisson,setnx简单实例_第1张图片

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);
        }

你可能感兴趣的:(java,分布式)