Controller
@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);
}
Service
@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;
}
版权声明:本文为qq_42614414原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。