建设智能网站,设计师品牌推荐,韩国美食做视频网站,wordpress 响应式 企业网站1. 前言
目的#xff1a;该项目只用于技术交流#xff0c;不用于过多商业用途。
适用#xff1a;可用于简历亮点、毕业答辩等。 2. 项目成果
2.1 秒杀主页
包含5个功能点#xff1a;
①、Product Name#xff1a;秒杀商品名称
②、Product Image#xff1a;秒杀商…1. 前言
目的该项目只用于技术交流不用于过多商业用途。
适用可用于简历亮点、毕业答辩等。 2. 项目成果
2.1 秒杀主页
包含5个功能点
①、Product Name秒杀商品名称
②、Product Image秒杀商品图片
③、Price秒杀价格
④、Seckill starts in距离秒杀所剩时间
⑤、Seckill Now秒杀按钮核心逻辑
部分不重要参数没有做UI设计只为功能而生。 2.2 秒杀架构
①、MySQL主从复制一主二从
②、Redis缓存、Redis分布式锁
③、MQ异步处理库存、订单 3. 核心代码讲解
3.1 缓存预热
Override
public void afterPropertiesSet() throws Exception {// 缓存秒杀商品ListSeckillGoods seckillGoodsList seckillMapper.queryAllSeckillGoods();for(SeckillGoods goods : seckillGoodsList) {String goodsId goods.getId();Integer stock goods.getGoodsStock();HashOperations hashOperations redisTemplate.opsForHash();hashOperations.put(CONSTANT.SECKILLGOODS, goodsId, stock);}// 缓存秒杀订单ListSeckillOrder seckillOrderList seckillMapper.queryAllSeckillOrder();for(SeckillOrder seckillOrder : seckillOrderList) {String userId seckillOrder.getUserId();String goodsId seckillOrder.getGoodsId();HashOperations hashOperations redisTemplate.opsForHash();hashOperations.put(CONSTANT.SECKILLORDER, userId , goodsId, CONSTANT.SECKILLORDER);}}
3.2 核心业务逻辑
Override
public MapString, String buySeckillGoods(String userId, String goodsId) {Map result new HashMapString, String();RLock lock redisson.getLock(CONSTANT.SECKILLLOCK); // 拿不到会自己阻塞try {lock.lock();// 检查Redis秒杀商品是否有库存Integer stock (Integer) redisTemplate.opsForHash().get(CONSTANT.SECKILLGOODS, goodsId);if(stock 0) {result.put(msg, 秒杀商品库存不足);result.put(success, 400);return result;}// 检查该用户是否秒杀过该商品Object orderConstant redisTemplate.opsForHash().get(CONSTANT.SECKILLORDER, userId , goodsId);if(orderConstant ! null) {result.put(msg, 该用户已经秒杀过该商品了);result.put(success, 400);return result;}// Redis新增订单String orderId UUID.randomUUID().toString();SeckillOrder seckillOrder new SeckillOrder();seckillOrder.setId(orderId);seckillOrder.setGoodsId(goodsId);seckillOrder.setUserId(userId);redisTemplate.opsForHash().put(CONSTANT.SECKILLORDER, userId , goodsId, CONSTANT.SECKILLORDER);// Redis减少库存redisTemplate.opsForHash().put(CONSTANT.SECKILLGOODS, goodsId, stock-1);// MQ处理库存和订单rabbitTemplate.convertAndSend(seckillGoodsExchange, seckillGoodsRouting, seckillOrder);rabbitTemplate.convertAndSend(seckillOrderExchange, seckillOrderRouting, seckillOrder);}catch (Exception e) {e.printStackTrace();}finally {lock.unlock(); // 解锁}result.put(msg, 秒杀商品成功);result.put(success, 200);return result;
} 4. 其他
还存在其他的补充点订单支付超时、订单真实支付、MQ消息问题、Redis单机问题等如果喜欢请三连我会继续更新。
需要完整代码或帮忙搭建环境请留下邮箱。