赞
踩
@RequestMapping(value = "/generatetoken",method = RequestMethod.POST,consumes = CONTENT_TYPE_FORMED)
@ResponseBody
public CommonRetureType generateToken() {
String killToken = promoService.generateSecondKillToken(itemId, promoId,userModel.getId());
if (killToken == null){
throw new BusinessException(EmBusinessError.UNKOWN_ERRORR,"生成秒杀令牌失败");
}
return CommonRetureType.create(killToken);
}
@Override public String generateSecondKillToken(Integer promoId,Integer itemId,Integer userId) { //判断是否库存已售罄,若对应的售罄key存在,则直接返回下单失败 //在下单减库存的过程中,如果库存为0,则redisTemplate.opsForValue().set("promo_item_stock_invalid_"+itemId,"true"); if(redisTemplate.hasKey("promo_item_stock_invalid_"+itemId)){ return null; } PromoDO promoDO = promoDOMapper.selectByPrimaryKey(promoId); //dataobject->model PromoModel promoModel = convertFromDataObject(promoDO); if(promoModel == null){ return null; } //判断当前时间是否秒杀活动即将开始或正在进行 if(promoModel.getStartDate().isAfterNow()){ promoModel.setStatus(1); }else if(promoModel.getEndDate().isBeforeNow()){ promoModel.setStatus(3); }else{ promoModel.setStatus(2); } //判断活动是否正在进行 if(promoModel.getStatus().intValue() != 2){ return null; } //判断item信息是否存在 ItemModel itemModel = itemService.getItemByIdInCache(itemId); if(itemModel == null){ return null; } //判断用户信息是否存在 UserModel userModel = userService.getUserByIdInCache(userId); if(userModel == null){ return null; } //获取秒杀大闸的count数量 //会有一个发布接口,去发布库大闸的数量,一般为秒杀数量的3到5倍 long result = redisTemplate.opsForValue().increment("promo_door_count_"+promoId,-1); if(result < 0){ return null; } //生成token并且存入redis内并给一个5分钟的有效期 String token = UUID.randomUUID().toString().replace("-",""); redisTemplate.opsForValue().set("promo_token_"+promoId+"_userid_"+userId+"_itemid_"+itemId,token); redisTemplate.expire("promo_token_"+promoId+"_userid_"+userId+"_itemid_"+itemId,5, TimeUnit.MINUTES); return token; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。