Java秒杀方案
目录
项目搭建
SpringBoot
Lombok
-
是一个Java库,它会自动插入编辑器和构建工具中,Lombok提供了一组有用的注释,用来消除Java类中的大量样板代码
Spring Web
Thymeleaf
-
是一个Java XML / XHTML / HTML5 模板引擎 ,可以在Web(基于servlet )和非Web环境中工作。它更适合在基于MVC的Web应用程序的视图层提供XHTML / HTML5,但它甚至可以在脱机环境中处理任何XML文件。它提供完整的Spring Framework
Mybatis-plus
分布式会话
用户登录
-
两次MD5加密 (MD5工具类)
-
用户端 :PASS = MD5(明文 固定salt)
-
客户端:PASS = MD5(用户输入 随机salt)
-
目的:用户端MD5加密是为了防止用户密码在网络中明文传输,服务端MD5加密是为了提高密码安全性,双重保险
-
逆向工程
-
使用了Mybatis-plus提供的AutoGenerator
-
生成数据库表对应的POJO、Mapper、Service、ServiceImpl、Controller等
参数校验
-
自定义注解
-
validation组件
-
isMobile注解
-
异常处理
-
@ControllerAdvice 和 @ExceptionHandler
-
只能处理控制器抛出的异常。此时请求已经进入控制器中,可以定义多个拦截方法,拦截不同的异常类,并且可以获取抛出的异常信息,自由度更大
-
-
@ErrorController
-
可以处理所有的异常,包括未进入控制器的错误
-
共享Session
- 目的:解决分布式会话的问题
-
问题:Nginx 使用默认负载均衡策略(轮询),请求将会按照时间顺序逐一分发到后端应用上。 也就是说刚开始我们在 Tomcat1 登录之后,用户信息放在 Tomcat1 的 Session 里。过了一会,请求 又被 Nginx 分发到了 Tomcat2 上,这时 Tomcat2 上 Session 里还没有用户信息,于是又要登录
-
方法一:使用Spring Session
-
只需添加依赖以及添加配置即可,不需要修改代码,重新登录,会发现Session已经存储在Redis上了
-
-
方法二:将用户信息存入Redis
-
添加依赖以及添加配置,并配置RedisConfig配置类
-
功能开发
前提:用逆向工程生成数据库表对应所需要的所有类
商品列表
商品详情
秒杀
-
秒杀前
-
秒杀中
-
秒杀结束
1、页面优化
- 缓存
- 页面缓存
- URL缓存
- 对象缓存
- 页面静态化 [主要对商品详情、秒杀页面、订单详情页面进行静态化处理]
- 库存超卖问题
- 唯一索引
- Lua脚本
2、服务优化
- RabbitMQ 异步下单
- 接口优化
- Redis预减库存
- 内存标记
3、安全优化
- 接口地址隐藏
- 算术验证码
- 接口限流
- 自定义拦截器
订单详情
系统压测
JMeter入门
-
步骤
-
1、添加--> 线程(用户) --> 线程组
-
2、添加--> 配置元件 --> HTTP请求默认值
-
3、添加 --> 取样器 --> HTTP请求
-
4、添加 --> 监听器 --> 聚合报告/图形结果/用表格察看结果
-
自定义变量
-
配置同一用户测试
-
配置不同用户测试
-
准备配置文件config.txt,,往里面添加具体用户及userTicket
-
添加 --> 配置元件 --> CSV Data Set Config
-
添加 --> 配置元件 --> HTTP Cookie管理器
-
JMeterr命令行
-
jmeter -n -t *.jmx -l *.jtl
正式压测
-
使用工具类UserUtil.java往数据库插入5000用户,并且调用登录接口获取token,写入config.txt
-
问题:并发一高会出现超卖的问题
-
-
商品列表
-
秒杀
页面优化
缓存
-
页面
-
Url
-
对象
静态化分离
-
商品详细
-
秒杀
-
订单详情
现在基本上都前后端分离,本项目利用Themeleaf模板引擎进行手动静态化,利用ajax进行接口调用,获取数据
将一些页面进行缓存,服务器只需要传输一些对象即可,减少传输量,速度会提高一些
库存超卖
-
给用户id和商品id加了唯一索引,用于避免一个用户进行多次下单操作
-
重新编写了SQL语句,对库存进行一个判断,防止库存变成负数
-
Lua脚本stock.lua
服务优化
RabbitMQ消息队列
接口优化
-
问题:即使加了优化,还是需要与数据库进行频繁的交互(数据库并发瓶颈低 ,远远不如缓存 ,但是仍然需要一些接口需要与数据库进行交互,如:获取库存、扣减库存等等),可以通过redis预减库存, 减少对数据库的访问,但是需要与redis频繁交互,而redis又是放在单独的服务器上的,还是 需要与redis服务器进频繁访问,所以我们提出一个内存标记,减少对redis服务器的访问
-
Redis 预减库存减少数据库的访问
-
内存标记减少Redis的访问
-
RabbitMQ异步下单
-
SpringBoot整合Rabbit MQ
-
交换机
-
使用Topic模式
-
分布式锁
-
Lua脚本lock.lua
安全优化
隐藏秒杀地址
-
用MD5生成一串随机数作为value存入Redis中
算术验证码
接口限流
-
自定义拦截器,实现接口限流
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfjjcgg
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13