本文建立在已完成可靠性传输的基础上,建议先阅读另一篇博文,不然可能难以理解。secKill项目 — 可靠性传输的实现 及 易错点总结
先看看秒杀接口的源代码:
@RequestMapping(value="/{path}/do_miaosha",method=RequestMethod.POST)
@ResponseBody
public Result<Integer> doMiaosha(Model model,MiaoshaUser user,
@RequestParam(value="goodsId",defaultValue="0") long goodsId,
@PathVariable("path")String path) {
model.addAttribute("user", user);
//0.判断用户是否非空、秒杀路径是否正确
// 1. 查看内存标记,看是否已结束
boolean over = localOverMap.get(goodsId);
if (over) {
return Result.error(CodeMsg.MIAO_SHA_OVER);
}
//2.预减少redis的库存
long stock=redisService.decr(GoodsKey.getMiaoshaGoodsStock,""+goodsId);
//3.判断减少数量1之后的stock,减少到0一下,则代表之后的请求都失败,直接返回
if(stock<0) {
//进行内存标记
localOverMap.put