# Seconds-Kill
本项目是一个模拟高并发环境下基于 SpringBoot 的秒杀购物平台。为了减少对数据库的直接访问,通过 Redis 实现了缓存优化;并通过 RabbitMQ 消息中间件来接收大量的并发请求,实现异步和削峰,然后再慢慢地更新数据库。最后通过 Jmeter 压测工具,可以很好地对比优化前后的 QPS...
## 目录
- [项目的基本配置及背景](#项目的基本配置及背景)
- [明文密码两次 MD5 加密](#明文密码两次-MD5-加密)
- [分布式 Session](#分布式-Session)
- [秒杀功能开发](#秒杀功能开发)
- [第一次压测](#第一次压测)
- [Jmeter 快速入门](#Jmeter-快速入门)
- [自定义变量模拟多用户](#自定义变量模拟多用户)
- [商品查询与秒杀下单压测](#商品查询与秒杀下单压测)
- [页面级高并发秒杀优化](#页面级高并发秒杀优化)
- [商品列表页缓存实现](#商品列表页缓存实现)
- [热点数据对象缓存](#热点数据对象缓存)
- [解决超卖问题](#解决超卖问题)
- [服务级高并发秒杀优化](#服务级高并发秒杀优化)
- [集成 RabbitMQ](#集成-RabbitMQ)
- [Redis 预减库存和RabbitMQ 异步下单](#Redis-预减库存和RabbitMQ-异步下单)
- [第二次压测](#第二次压测)
- [写在最后](#写在最后)
## 项目的基本配置及背景
项目用的是 SpringBoot 2.1.5、thymeleaf 2.0.4、MyBatis 1.3.2、MySQL 8.0、最新版本的 Redis、Jmeter 压测工具和 RabbitMQ 消息中间件,其中 Redis、Jmeter 和 RabbitMQ 的相关配置是部署在虚拟机上,最后将项目打成 jar 包在虚拟机上运行。具体的环境配置过程稍微有点复杂,网上有具体博客可作参考,这里不加详述。
本项目是一个秒杀系统,秒杀与其他业务最大的区别在于秒杀的瞬间:
1. 系统的并发量会非常的大
2. 并发量大的同时,网络的流量也会瞬间变大
关于第一点,核心问题在于如何在大并发的情况下能保证 DB 能扛得住压力,因为大并发的瓶颈就在于 DB。如果说请求直接从前端透传到 DB,显然,DB 是无法承受几十万上百万甚至上千万的并发量的。所以,我们能做的只能是减少对 DB 的访问,比如前端发出了1000万个请求,通过我们的处理,最终只有100个会访问 DB,这样就可以了!针对秒杀这种场景,因为秒杀商品的数量是有限的,这种做法刚好适用!
关于第二点,最常用的办法就是做页面静态化,也就是常说的前后端分离:把静态页面直接缓存到用户的浏览器端,所需要的数据从服务端接口动态获取。这样会大大节省网络的流量,再加上 CDN,一般不会有大问题。
**如何减少DB的访问?**
假如某个商品可秒杀的数量是10,那么在秒杀活动开始之前,把商品的 goodsId 和数量加载到 Redis 缓存。服务端收到请求的时候,首先预减一下 Redis 里面的数量,如果数量减到0随后的访问直接返回秒杀失败。也就是说,只有10个请求最终会去实际地请数据库。
当然,如果我们的商品数比较多,10000件商品参与秒杀,10000 * 10 = 100000个并发去请求 DB,DB 的压力还是会很大,这里就用到另一个非常重要的组件:消息队列。我们不是把请求直接去访问 DB,而是先把请求写到消息队列,做一个缓存,然后再去缓慢地更新数据库。这样做以后,前端用户的请求可能不会立即得到响应是成功还是失败,很可能得到的是一个排队中的返回值。这个时候,需要客户端再去服务端轮询,因为我们不能保证一定就秒杀成功了。当服务端出队,生成订单以后,把用户 id 和商品 goodsId 写到缓存中,来应对客户端的轮询就可以了。
这样处理以后,我们的应用是可以很简单的进行分布式横向扩展的,以应对更大的并发。
## 明文密码两次 MD5 加密
通过两次 MD5 加密提高数据校验的安全性。第一次 MD5 是防止用户的明文密码在网络上传输,第二次 MD5 是防止网上相关的 MD5 解密反查。
第一次 MD5 加密:用户端:password = MD5(明文 + 固定 salt -> "1a2b3c4d")
第二次 MD5 加密:password = MD5(用户端输入 + 随机 salt)
数据库中 user 表里插入的即为第二次加密的密码和随机 salt。
## 分布式 Session
每次登录都会生成一个 token 并把它加入到 Cookie 中,在跳转不同页面时,会把 token 对应的 user 从 Redis 中取出。
改进:通过 UserArgumentResolver 封装之前加入 Cookie、由 token 得到 user 等一系列操作。
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
webRequest.getNativeRequest();
HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
String paramToken = request.getParameter(MiaoshaUserService.COOKIE_NAME_TOKEN);
String cookieToken = getCookieValue(request, MiaoshaUserService.COOKIE_NAME_TOKEN);
if (StringUtils.isEmpty(cookieToken) && StringUtils.isEmpty(paramToken)) {
return null;
}
String token = StringUtils.isEmpty(paramToken) ? cookieToken : paramToken;
return userService.getByToken(response, token);
}
## 秒杀功能开发
**主要思路:**
1. 首先判断秒杀商品的库存,如果小于等于0,则直接返回秒杀失败
2. 判断是否已经秒杀到了商品,即从数据库中查看该用户是否已经存在对应商品的订单,如果有则重复秒杀
3. 减库存
4. 生成订单(order_info + miaosha_order)
但存在一些问题,比如高并发下存在的超卖问题,以及怎样有效地减少大量对数据库访问的请求...
## 第一次压测
### Jmeter 快速入门
在 [jmeter 官网](https://jmeter.apache.org/download_jmeter.cgi) 下载“.tgz”结尾的安装包在虚拟机 CentOS 7(带桌面系统) 安装,下载“.zip”结尾的压缩包在本机 windows 10 环境下安装,具体安装过程可自行百度,
在虚拟机上安装的 jmeter 通过在 bin 文件夹下输入命令行 ./jmeter.sh 运行 jmeter;在 windows 上安装的 jmeter 通过在打开 bin 文件夹下的 jmeter.bat 文件运行 jmeter。
**线程组**
测试计划 -> 添加 -> Threads -> 线程组
本项目设置线程数为5000,循环次数为10,即总共50000个并发。
**HTTP 请求默认值**
线程组 -> 配置元件 -> HTTP 请求默认值
协议:http
服务器名称或IP:虚拟机的 IP
端口号:8080
**HTTP请求**
线程组 -> Sample -> HTTP请求
方法:GET
路径:本项目中用到了 /goods/to_list(商品查询) 和 /miaosha/do_miaosha(秒杀下单) 两个路径
**聚合报告**
线程组 -> 监听器 -> 聚合报告
显示压测的具体情况,包括并发量、Error、QPS 等信息。
### 自定义变量模拟多用户
**Jmeter 自定义变量**
线程组 -> 配置元件 -> CSV Data Set Config
通过配置文件模拟多用户 token 访问页面,实现秒杀订单。
配置文件格式为:userId,token
在 HTTP 请求页中添加参数 token(参数名称),参数值用 ${token} 作为变量的引用,最后开始压测。
### 商品查询与秒杀下单压测
压测环境是 VMware 虚拟机,系统为 CentOS 7,2G 内存,CPU 两个 processor。
商品查询压测结果:/goods/to_list
<div align="center"><img src="/img//first_to_list.png" width=""/></div>
秒杀下单压测结果:/miaosha/do_miaosha
<div align="center
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
这里为你收集整理了关于毕业设计、课程设计可参考借鉴的资料一份,质量非常高,如果你投入时间去研究几天相信肯定对你有很大的帮助。到时候你会回来感谢我的。 本资源是经过本地编译测试、可打开、可运行的项目、文件或源码,可以用于毕业设计、课程设计的应用、参考和学习需求,请放心下载。 祝愿你在这个毕业设计项目中取得巨大进步,顺利毕业! 但还需强调一下,这些项目源码仅供学习和研究之用。在使用这些资源时,请务必遵守学术诚信原则和相关法律法规,不得将其用于任何商业目的或侵犯他人权益的行为。对于任何因使用本资源而导致的问题,包括但不限于数据丢失、系统崩溃或安全漏洞,风险自担哦!
资源推荐
资源详情
资源评论
收起资源包目录
毕业设计-A SpringBoot project based on Redis and RabbitMQ (1).zip (112个子文件)
mvnw.cmd 6KB
bootstrap.css 143KB
bootstrap.min.css 118KB
bootstrap-theme.css 26KB
bootstrap-theme.min.css 23KB
layer.css 14KB
layer.css 5KB
glyphicons-halflings-regular.eot 20KB
loading-0.gif 6KB
loading-2.gif 2KB
loading-1.gif 701B
.gitignore 303B
goods_detail.htm 8KB
order_detail.htm 3KB
goods_detail.html 3KB
login.html 3KB
order_detail.html 2KB
goods_list.html 2KB
miaosha_fail.html 246B
hello.html 232B
maven-wrapper.jar 47KB
MiaoshaController.java 6KB
RedisService.java 6KB
GoodsController.java 6KB
MavenWrapperDownloader.java 5KB
MiaoshaUserService.java 4KB
UserUtil.java 3KB
DemoController.java 3KB
OrderService.java 2KB
UserArgumentResolver.java 2KB
MQReceiver.java 2KB
OrderInfo.java 2KB
MQConfig.java 2KB
MiaoshaService.java 2KB
OrderController.java 2KB
CodeMsg.java 2KB
LoginController.java 2KB
MiaoshaUser.java 2KB
MQSender.java 2KB
Goods.java 1KB
OrderDAO.java 1KB
GlobalExceptionHandle.java 1KB
GoodsDAO.java 1KB
MD5Util.java 1KB
GoodsService.java 1KB
ResultUtil.java 1KB
MiaoshaGoods.java 997B
GoodsVo.java 903B
IsMobileValidator.java 875B
GoodsDetailVo.java 865B
LoginVo.java 767B
MiaoshaOrder.java 742B
BasePrefix.java 645B
WebConfig.java 639B
IsMobile.java 636B
MiaoshaUserDAO.java 619B
UserController.java 599B
RedisConfig.java 569B
RedisPoolFactory.java 494B
ValidatorUtil.java 482B
GoodsKey.java 479B
GlobalException.java 476B
MiaoshaMessage.java 475B
User.java 428B
OrderDetailVo.java 422B
UserDAO.java 413B
MiaoshaUserKey.java 410B
UserService.java 386B
SecKillApplication.java 381B
SecKillApplicationTests.java 333B
OrderKey.java 228B
MiaoshaKey.java 223B
UserKey.java 211B
UUIDUtil.java 193B
KeyPrefix.java 120B
bg.jpg 3.62MB
bg2.jpg 80KB
jquery.min.js 82KB
bootstrap.js 68KB
bootstrap.min.js 36KB
layer.js 21KB
jquery.validate.min.js 21KB
additional-methods.min.js 17KB
md5.min.js 10KB
layer.js 3KB
common.js 1KB
messages_zh.min.js 1KB
npm.js 484B
bootstrap.min.css.map 529KB
bootstrap.css.map 380KB
bootstrap-theme.css.map 47KB
bootstrap-theme.min.css.map 25KB
README.md 18KB
mvnw 9KB
iphone8.png 340KB
mi6.png 74KB
meta10.png 41KB
iphonex.png 23KB
icon.png 11KB
icon-ext.png 6KB
共 112 条
- 1
- 2
资源评论
高校毕业设计
- 粉丝: 193
- 资源: 385
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功