记录一次处理并发的操作

8月份因为有一个惠民票不需要支付的在卖(限购规则是一个身份证号只能买一张),客户偶然发现出现了1个人存在相同时间内下了多个订单的情况,也就是同一秒内1个人多个订单,刚开始以为是个例,后来去数据库查发现大概发现了200例左右,为了防止并发,首先想到的是建立在内存基础上并且是原子操作的redis。代码如下:
try {

String isExist=redisUtil.get("PromotionIdCard",String.class);
   if(isExist!=null) {
            throw new RuntimeException("短时间内重复访问");
        }else {
             boolean saveFlag=redisUtil.set("PromotionIdCard", idcard, 15);//当身份证号放在redis里面
             if(!saveFlag) {
                 //日志记录 缓存服务器异常
                 logger.info("缓存保存异常,身份证号是:"+idcard);
             }
            }
    }  catch(Exception e){
    throw new Runtimetion("");
    } finally {
    redisUtil.delete("PromotionIdCard");
    }

最后这个情况确实得到了控制 。
但一次在跟面试的时候提到了这个问题的解决方案,他问我为什么要引入这么重量级的缓存框架,为什么不用JDK自身所带的锁,当时提到这里有点懵逼,没想到怎么回答,面试就结束了。
回来想了想,自己写了段伪代码。
/**
这个变量的定义一定要放在方法外面
*/
AtomicInteger sign = new AtomicInteger();
saveOrder(){

    try {
        int updatedValue = sign.incrementAndGet();
        if(updatedValue > 1) {
            throw new RuntimeException("短时间内防止重复请求");
        }
        //执行订单保存的逻辑
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        sign.set(0);
    }   
    }   

猜你喜欢

转载自blog.csdn.net/weixin_40412665/article/details/81943343