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

防止重复请求,解决:使用分布式锁,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);
        }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谷咕咕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值