当前位置: 首页 > news >正文

从零搭建秒杀服务

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 {// 缓存秒杀商品List<SeckillGoods> 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);}// 缓存秒杀订单List<SeckillOrder> 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 Map<String, String> buySeckillGoods(String userId, String goodsId) {Map result = new HashMap<String, 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单机问题等),如果喜欢请三连,我会继续更新。

需要完整代码或帮忙搭建环境,请留下邮箱。

http://www.lryc.cn/news/94822.html

相关文章:

  • 数据库应用:CentOS 7离线安装PostgreSQL
  • 【PHP面试题42】Laravel依赖注入实现的原理是怎么样的
  • 如何在本地组策略编辑器中启用或禁用剪贴板历史记录
  • 如何与ChatGPT愉快地聊天
  • 使用Gradio库进行交互式数据可视化:Timeseries模块介绍
  • CONTAINER = ALL是ALTER USER语句的默认值
  • 华为发布大模型时代AI存储新品
  • 5G网络功能介绍
  • 笙默考试管理系统-MyTestMean(13)
  • Tomcat之高可用配置
  • IDEA中springboot的热加载thymeleaf静态html页面
  • Java中可以使用哪些系统架构?怎样选择?
  • 一文详解什么是数据库分片
  • 百度留痕是什么方法排名的
  • 基于时域特征和频域特征组合的敏感特征集,再利用CNN进行轴承故障诊断(python编程)
  • CAD2021安装教程适合新手小白【附安装包和手册】
  • AcWing 107. 超快速排序—逆序对
  • 华为、阿里巴巴、字节跳动 100+ Python 面试问题总结(三)
  • 详解在Linux中修改Tomcat使用的jdk版本
  • 高级 Matplotlib:3D 图形和交互性
  • cloud Alibab+nacos+gateway集成swaggerui,统一文档管理(注意点)
  • 使用 YOLOv8 进行传输线故障检测-附源码
  • 安装RabbitMQ 详细步骤
  • SAP CAP篇十:理解Fiori UI的Annoation定义
  • 不允许你不知道的 MySQL 优化实战(二)
  • JVM_00000
  • MCU嵌入式开发-硬件和开发语言选择
  • SVR算法简介及与其它回归算法的关系
  • Rust系列(二) 内存管理
  • VYaml | 超快速低内存占用yaml库