当前位置: 首页 > 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单机问题等),如果喜欢请三连,我会继续更新。

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

相关文章:

从零搭建秒杀服务

1. 前言 目的&#xff1a;该项目只用于技术交流&#xff0c;不用于过多商业用途。 适用&#xff1a;可用于简历亮点、毕业答辩等。 2. 项目成果 2.1 秒杀主页 包含5个功能点&#xff1a; ①、Product Name&#xff1a;秒杀商品名称 ②、Product Image&#xff1a;秒杀商…...

数据库应用:CentOS 7离线安装PostgreSQL

目录 一、理论 1.PostgreSQL 2.PostgreSQL离线安装 3.PostgreSQL初始化 4.PostgreSQL登录操作 二、实验 1.CentOS 7离线安装PostgreSQL 2.登录PostgreSQL 3.Navicat连接PostgreSQL 三、总结 一、理论 1.PostgreSQL &#xff08;1&#xff09;简介 PostgreSQL 是一个…...

【PHP面试题42】Laravel依赖注入实现的原理是怎么样的

文章目录 一、前言二、什么是依赖注入三、Laravel依赖注入的实现原理3.1 Laravel依赖注入的实现原理&#xff1a;3.2 Laravel依赖注入的代码示例 四、总结 一、前言 本文已收录于PHP全栈系列专栏&#xff1a;PHP面试专区。 计划将全覆盖PHP开发领域所有的面试题&#xff0c;对标…...

如何在本地组策略编辑器中启用或禁用剪贴板历史记录

复制粘贴是我们大家都会做的事情,可能一天要做多次。但是,如果你需要一次又一次地复制同样的几件事,你该怎么办?如何在设备上复制内容? 从Windows 10版本17666开始,微软正在解决这一问题,并将剪贴板提升到一个新的水平,只需按下Win+V,你将获得全新的剪贴板体验。 你…...

如何与ChatGPT愉快地聊天

原文链接&#xff1a;https://mp.weixin.qq.com/s/ui-O4CnT_W51_zqW4krtcQ 人工智能的发展已经走到了一个新的阶段&#xff0c;在这个阶段&#xff0c;人工智能可以像人一样与我们进行深度的文本交互。其中&#xff0c;OpenAI的ChatGPT是一个具有代表性的模型。然而&#xff0…...

使用Gradio库进行交互式数据可视化:Timeseries模块介绍

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…...

CONTAINER = ALL是ALTER USER语句的默认值

连接到root时查看有关root&#xff0c;CDB和PDB的数据 当公用用户执行查询时&#xff0c;可以限制X $表和V $&#xff0c;GV $和CDB_ *视图的视图信息。X$表和这些视图包含有关应用程序root及其关联应用程序PDB的信息&#xff0c;或者如果连接到CDB root&#xff0c;则是整个C…...

华为发布大模型时代AI存储新品

7月14日&#xff0c;华为发布大模型时代AI存储新品&#xff0c;为基础模型训练、行业模型训练&#xff0c;细分场景模型训练推理提供存储最优解&#xff0c;释放AI新动能。 企业在开发及实施大模型应用过程中&#xff0c;面临四大挑战&#xff1a; 首先&#xff0c;数据准备时…...

5G网络功能介绍

5G系统架构由以下网络功能(NF)组成 -身份验证服务器功能(AUSF)。 -接入和移动性管理功能(AMF)。 -数据网络(DN),例如运营商服务、互联网接入或第三方服务。 -非结构化数据存储功能(UDSF)。 -网络曝光功能(NEF)。 -网络存储库功能(NRF)。 -网络切片特定身…...

笙默考试管理系统-MyTestMean(13)

笙默考试管理系统-MyTestMean&#xff08;13&#xff09; 目录 一、 笙默考试管理系统-MyTestMean 二、 笙默考试管理系统-MyTestMean 三、 笙默考试管理系统-MyTestMean 四、 笙默考试管理系统-MyTestMean 五、 笙默考试管理系统-MyTestMean 笙默考试管理系统-MyTes…...

Tomcat之高可用配置

Nginx搭配Tomcat实现负载均衡 传统模型下&#xff0c;一个项目部署在一台tomcat上&#xff0c;这个时候&#xff0c;假如tomcat因为服务器资源不够&#xff0c;突然挂机了&#xff0c;那么整个项目就无法使用。 Nginx就可以避免单台服务如果挂机&#xff0c;依然能保证服务正…...

IDEA中springboot的热加载thymeleaf静态html页面

1.首先加入开发工具依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional> </dependency> 2.其次在build maven插件中开启热部署 <bu…...

Java中可以使用哪些系统架构?怎样选择?

架构&#xff0c;又名软件架构&#xff0c;是有关软件整体结构与组件的抽象描述&#xff0c;用于指导大型软件系统各个方面的设计。 Java企业级的应用根据业务的复杂程度&#xff0c;通常使用的系统架构有应用架构、垂直应用架构、面向服务的架构(Service-Oriented Architectu…...

一文详解什么是数据库分片

概要 应用程序正在变得越来越好&#xff0c;它拥有更多的功能、更多的活跃用户&#xff0c;并且每天都会收集更多的数据。但数据库现在导致应用程序的其余部分变慢。数据库分片可能是问题的答案&#xff0c;但许多人不知道它是什么&#xff0c;最重要的是何时使用它。在本文中我…...

百度留痕是什么方法排名的

百度留痕是什么方法排名的,黑帽seo教学&#xff1a;谷歌外推搜索留痕关键词秒收录排名软件技术培训 #外推留痕 #黑帽seo #黑帽seo培训 今天给大家看一个百度留痕的一个链接&#xff0c;东西也很简单&#xff0c;其实就是前面的一个地址加后面的一个你的联系方式&#xff0c;你…...

基于时域特征和频域特征组合的敏感特征集,再利用CNN进行轴承故障诊断(python编程)

1.文件夹介绍&#xff08;使用的是CWRU数据集&#xff09; 0HP-3HP四个文件夹装载不同工况下的内圈故障、外圈故障、滚动体故障和正常轴承数据。 2.模型 按照1024的长度分割样本&#xff0c;构建内圈故障、外圈故障、滚动体故障和正常轴承样本集 2.1.计算11种时域特征值 # 计…...

CAD2021安装教程适合新手小白【附安装包和手册】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、下载文件二、使用步骤1.安装软件前&#xff0c;断开电脑网络&#xff08;拔掉网线、关闭WIFI&#xff09;2、鼠标右击【AutoCAD2021(64bit)】压缩包选择【解…...

AcWing 107. 超快速排序—逆序对

问题链接: AcWing 107. 超快速排序 问题描述 分析 这道题考查的算法不难&#xff0c;就只是利用归并排序来求逆序对的数量&#xff0c;但是主要是如何分析问题&#xff0c;如何能从问题中看出来和逆序对数量有关&#xff0c;现在的题目基本上很少是那种模板算法题了&#xff…...

华为、阿里巴巴、字节跳动 100+ Python 面试问题总结(三)

系列文章目录 个人简介&#xff1a;机电专业在读研究生&#xff0c;CSDN内容合伙人&#xff0c;博主个人首页 Python面试专栏&#xff1a;《Python面试》此专栏面向准备面试的2024届毕业生。欢迎阅读&#xff0c;一起进步&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; …...

详解在Linux中修改Tomcat使用的jdk版本

问题分析 由于部署个人项目使用了openjdk11&#xff0c;但是我之前安装的是jdk1.8&#xff0c;jdk版本升级的后果就是&#xff0c;tomcat运行的时候报一点小bug&#xff08;因为之前安装tomcat默认使用了系统的jdk版本&#xff09;所以就想着把tomcat使用的jdk版本调回原来的&…...

安宝特案例丨寻医不再长途跋涉?Vuzix再次以AR技术智能驱动远程医疗

加拿大领先科技公司TeleVU基于Vuzix智能眼镜打造远程医疗生态系统&#xff0c;彻底革新患者护理模式。 安宝特合作伙伴TeleVU成立30余年&#xff0c;沉淀医疗技术、计算机科学与人工智能经验&#xff0c;聚焦医疗保健领域&#xff0c;提供AR、AI、IoT解决方案。 该方案使医疗…...

NLP常用工具包

✨做一次按NLP项目常见工具的使用拆解 1. tokenizer from torchtext.data.utils import get_tokenizertokenizer get_tokenizer(basic_english) text_sample "Were going on an adventure! The weather is really nice today." tokens tokenizer(text_sample) p…...

SpringBoot3中使用虚拟线程的详细过程

在 Spring Boot 3 中使用 Java 21 的虚拟线程&#xff08;Virtual Threads&#xff09;可以显著提升 I/O 密集型应用的并发能力。以下是详细实现步骤&#xff1a; 1. 环境准备 JDK 21&#xff1a;确保安装 JDK 21 或更高版本Spring Boot 3.2&#xff1a;最低要求&#xff08;p…...

Appium+python自动化(八)- 认识Appium- 下章

1、界面认识 在之前安装appium的时候说过我们有两种方法安装&#xff0c;也就有两种结果&#xff0c;一种是有界面的&#xff08;客户端安装&#xff09;&#xff0c;一种是没有界面的&#xff08;终端安装&#xff09;&#xff0c;首先我们先讲一下有界面的&#xff0c;以及界…...

Linux系统编程-DAY10(TCP操作)

一、网络模型 1、服务器/客户端模型 &#xff08;1&#xff09;C/S&#xff1a;client server &#xff08;2&#xff09;B/S&#xff1a;browser server &#xff08;3&#xff09;P2P&#xff1a;peer to peer 2、C/S与B/S区别 &#xff08;1&#xff09;客户端不同&#…...

Secs/Gem第十二讲(基于secs4net项目的ChatGpt介绍)

好&#xff0c;那我们进入最关键的一讲—— 第十二讲&#xff1a;完整事件通知流程全景图——CEID 触发到主机接收的全过程 关键词&#xff1a;CEID 事件上报、S6F11 报文、事件触发流程、数据驱动机制、Report Dispatch、主机解析流程 本讲目标 你将彻底理解&#xff1a; 设…...

STM32入门学习之系统时钟配置

1. 时钟就是单片机的心脏。单片机根据时钟频率来控制每个部件的工作&#xff0c;时钟是单片机的脉搏&#xff0c;决定了每条命令运行的速率&#xff0c;没有时钟单片机将停止工作。 如何理解“时钟决定了单片机每条命令运行的速率”&#xff1f; 首先需要去理解单片机中的时…...

单例模式与锁(死锁)

目录 线程安全的单例模式 什么是单例模式 单例模式的特点 饿汉实现方式和懒汉实现方式 饿汉⽅式实现单例模式 懒汉⽅式实现单例模式 懒汉⽅式实现单例模式(线程安全版本) 单例式线程池 ThreadPool.hpp threadpool.cc 运行结果 线程安全和重⼊问题 常⻅锁概念 死…...

如何做好一份优秀的技术文档:专业指南与最佳实践

如何做好一份优秀的技术文档&#xff1a;专业指南与最佳实践 技术文档是产品开发、用户支持和团队协作的核心工具。高质量的技术文档能够提升开发效率、降低维护成本并改善用户体验。本文将从实践出发&#xff0c;详细讲解如何编写专业、清晰且实用的技术文档。 &#x1f31f;…...

pgsql batch insert optimization (reWriteBatchedInserts )

reWriteBatchedInserts 是 PostgreSQL JDBC 驱动 提供的一个优化选项&#xff0c;它可以 重写批量插入语句&#xff0c;从而提高插入性能。 作用 当 reWriteBatchedInsertstrue 时&#xff0c;PostgreSQL JDBC 驱动会将 多个单独的 INSERT 语句 转换为 一个多行 INSERT 语句&a…...