商品秒杀会出现线程安全问题,需要在查询的时候加synchronized关键字,解决线程安全问题,但是synchronized性能比较低;
知识点:商品秒杀思路
1.先判断宠物id是否为空;
2.在判断宠物是否为秒杀商品;
3.在判断是否还有库存;
4.把订单信息入库;
5.商品库存-1;
6.拉起支付页面,完成支付;
用自定义注解+拦截器完成恶意防刷的功能
用两个元注解,加在方法上,
//Target注解决定 MyLog 注解可以加在哪些成分上,如加在类身上,或者属性身上,或者方法身上等成分 @Target({ ElementType.PARAMETER, ElementType.METHOD }) //Retention注解括号中的"RetentionPolicy.RUNTIME"意思是让 MyLog 这个注解的生命周期一直程序运行时都存在 @Retention(RetentionPolicy.RUNTIME) public @interface AnnotationMS { //发送间隔 int sender()default 1; //发送次数 int count()default 1; //一秒钟只能发一次请求 }
再配合拦截器一起使用,下面是一个思路
//防止恶意防刷的实现 //1.先获取用户的ip和token 组合成唯一标识key; String token = request.getHeader("token");//token String ip = request.getRemoteAddr();//ip地址 String tokenAndIp=token+ip; //2.从redis中通过key取到value; Integer TIValue = (Integer)redisTemplate.opsForValue().get(tokenAndIp); if(TIValue!=null){ return JSONResult.error("访问太频繁了,请稍后再来!!!"); } //3.在把key存入redis; redisTemplate.opsForValue().set(tokenAndIp,1,1, TimeUnit.SECONDS);
1.小记;
request.getRemoteaddr();根据此方法来获取用户IP地址;
@configurationProperties(prefix=" ") <<---括号里写yml全路径 ;
这个注解用来获取yml里面的配置参数;