1.因为前端页面时间跟服务器时间不一致或者存在网络传输时间
因此后端需要校验当前请求访问的时间是不是在秒杀时间内,如果不存在则不允许抢购
2.秒杀肯定是要部署多台服务器,如果存在库存或者其他的统一的问题,需要注意部署多台服务器的环境
redisClient.setnx(newKey+m,String.valueOf(newValue)) ;redis的setnx是有锁控制
3.限流控制,接口压测后会有压测数据,根据压测数据,Nginx进行每秒访问次数控制
4.程序接口控制访问人数,如果超过访问次数则限制访问,例如下面的demo
public class SpikeController { @Value("${spike.req.limit.count}") private int limitCount ; @Value("${spike.req.limit.time}") private long limitTime ; @Autowired public SpikeController(){ } @ControllerAdvice public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice { public JsonpAdvice() { super("callback"); } } private static AtomicInteger reqCount =new AtomicInteger(0) ; private static long startTime =0 ; @GetMapping ("/limitreq") public CommonResponse limitreq(HttpServletRequest httpServletRequest ){ CommonResponse resp =null; long now = System.currentTimeMillis()/1000 ; log.info("count:"+reqCount.get()); if (startTime==0) startTime = now ; if(now-startTime<limitTime){ log.info("限制时间内"); if(reqCount.get()>limitCount){ log.info("超过限制次数了"); resp = new CommonResponse(1001,"") ; }else{ resp = new CommonResponse(1000,"") ; } reqCount.getAndAdd(1) ; }else{ log.info("限制时间外"); startTime = now ; reqCount = new AtomicInteger(0) ; resp = new CommonResponse(1000,"") ; } return resp ; } }5.秒杀商品可以利用数据库行锁,也就是常说的 乐观锁处理