JAVA全系列 教程
3762个小节阅读:7094k
目录
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
为了让用户购买速度更快,秒杀商品时不会将商品添加到购物车,而是直接生成订单。并且由于访问量较大,为了避免数据库压力过大,我们会先将订单数据保存在redis当中,等用户支付完成后,再将redis中的订单数据保存到数据库中。
在秒杀实现类重写生成秒杀订单方法
xxxxxxxxxx
@Override
public Orders createOrder(Orders orders) {
// 1.生成订单对象
orders.setId(IdWorker.getIdStr()); // 手动生产订单id
orders.setStatus(1); // 订单状态未付款
orders.setCreateTime(new Date()); // 订单创建时间
orders.setExpire(new Date(new Date().getTime() + 1000*60*5)); // 订单过期时间
// 计算商品价格
CartGoods cartGoods = orders.getCartGoods().get(0);
Integer num = cartGoods.getNum();
BigDecimal price = cartGoods.getPrice();
BigDecimal sum = price.multiply(BigDecimal.valueOf(num));
orders.setPayment(sum);
// 2.减少秒杀商品库存
// 查询秒杀商品
SeckillGoods seckillGoods = findSeckillGoodsByRedis(cartGoods.getGoodId());
// 查询库存,库存不足抛出异常
Integer stockCount = seckillGoods.getStockCount();
if (stockCount <= 0){
throw new BusException(CodeEnum.NO_STOCK_ERROR);
}
// 减少库存
seckillGoods.setStockCount(seckillGoods.getStockCount() - cartGoods.getNum());
redisTemplate.boundHashOps("seckillGoods").put(seckillGoods.getGoodsId(),seckillGoods);
// 3.保存订单数据
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.opsForValue().set(orders.getId(),orders);
return orders;
}
编写秒杀控制器
xxxxxxxxxx
/**
* 生成秒杀订单
* @param orders 订单对象
* @return 生成的订单
*/
@PostMapping("/add")
public BaseResult<Orders> add(@RequestBody Orders orders,@RequestHeader Long userId){
orders.setUserId(userId);
Orders order = seckillService.createOrder(orders);
return BaseResult.ok(order);
}
测试接口