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