当前位置:网站首页>【学习笔记】seckill-秒杀项目--(11)项目总结
【学习笔记】seckill-秒杀项目--(11)项目总结
2022-07-03 03:30:00 【47roroya】
一、秒杀项目总结
1.1 项目框架搭建
- SpringBoot环境搭建
- 集成Thymeleaf,RespBean
- Mybatis
1.2 分布式会话
- 用户登录
- 设计数据库
用户表:账户id,密码,加密盐等 - 明文密码二次MD5加密
第一次是因为http明文传输需要加密,第二次是防止数据库被盗 - 参数校验+全局异常处理
通过对输入的参数LoginVo加注解@validated,然后在传入的参数mobile和password上加上注解判断是否为空
全局异常处理为了提示用户出现的异常
- 设计数据库
- 共享Session
- SpringSession
- Redis
1.3功能开发
- 商品列表
为了展示商品信息,需要封装GoodsVo,来展示商品信息,包括价格,库存,秒杀起止时间等 - 商品详情
同样需要GoodsDetailsVo - 秒杀
在控制层先判断库存,在redis中预减库存,然后判断订单是否存在,发送请求 到消息队列,后创建订单 - 订单详情
创建OrderVo
1.4 系统压测
- JMeter
- 自定义变量模拟多用户
- 正式压测
- 商品列表
- 秒杀
1.5 页面优化
- 页面缓存+URL缓存+对象缓存
- 秒杀的瓶颈在数据库,所以要加上各种粒度的缓存,最大的是页面缓存、最小的是对象缓存
- 页面缓存步骤(商品列表)
从redisService中取缓存,如果缓存中没有则利用thymeleaf手动渲染页面,然后将页面加入缓存,并返回渲染页面。 - URL缓存(商品详情页)
与页面缓存步骤基本一致,但是需要取缓存和加缓存时加上参数商品ID - 对象缓存(User)
前面的页面缓存和URL缓存适合变化不大的,缓存时间比较短的。对象缓存是长期缓存。第一步是取缓存,若缓存没有,则去数据库中查找,并加入缓存;如果数据库中没有,则抛出异常。
- 页面静态化,前后端分离
- 页面静态化就是使用纯HTML页面+Ajax请求json数据后再填充页面
- 若A页面跳转到B页面之前需要条件判断可以先再A页面中利用ajax请求判断后再跳转
- 不需要的话可以直接跳转到B页面,由B页面自己发起ajax请求
- 静态资源优化
1.6 接口优化
- Redis预减库存,减少数据库访问
- 内存标记,减少Redis访问
在系统初始化的时候加载商品库存到redis中进行标记,判断库存时不需要去数据库读取,直接在redis中进行读取 - RabbitMQ异步下单
- SpringBoot整合RabbitMQ
- 交换机
1.7 安全优化
- 秒杀接口地址隐藏
前端页面在秒杀未开始时秒杀按钮设置为不可用,可是有可能有用户通过前端js代码找到秒杀地址,在秒杀未开始前直接访问,秒杀接口隐藏的目的是用户通过js获取到的秒杀地址不能让他进行秒杀操作
在秒杀开始之前通过Controller中的/path路径下的类随机生成一个path,然后和用户ID、商品ID一起存入redis。在执行秒杀的时候再从redis中取path进行验证,然后再进行秒杀 - 算术验证码
- 接口防刷
当用户访问接口时,把访问次数写入缓存,并设置有效期。一分钟内记录访问次数,如果超出限制,则进行限流操作。如果没有超限,则缓存消失,下次访问时再重新写入缓存
1.8 秒杀流程
- 登录进入商品列表页面,静态资源缓存进redis
- 点击进入商品详情页面,静态资源缓存进redis,通过Ajax获取验证码等动态信息
- 点击秒杀,将验证码结果和商品ID传给后端,如果正确。动态生成UUID,加上用户ID和商品ID存入redis,并将路径path传到前端。前端根据path地址调用秒杀服务
- 服务端获取请求的path参数,查询是否存在缓存
- 存在的话,且redis中还有库存信息,则在redis中进行预减库存,看是否生成订单,没有的话,将请求发送到消息队列
- 从消息队列中获取消息:获取商品ID,用户ID,进行下单操作
- 下单操作:减库存,生成订单
- 前端轮询订单生成结果和秒杀成功与否
二、项目重难点
秒杀接口高并发的实现、以及安全优化
三、项目推荐
在做完秒杀或者谷粒商城后,想自己做个个性化的项目一般选择什么?可以根据亮点和难点来进行设计。
3.1 项目亮点设计
- 代码质量
比如做单元测试,测试代码覆盖率 - 项目上线
部署到云上 - 制造事故现场,压测现场
比如加缓存,性能提升多少倍
3.2 项目难点设计
- 制造内存泄漏OOM的Bug,然后制造排查、修复的过程
- 制造并发问题,比如出现死锁、HashMap导致并发,换成ConcurrentHashMap、原子类、volatile
- 流量突增问题,蓄洪泄洪
边栏推荐
- The series of hyperbolic function in daily problem
- Stepping on pits and solutions when using inputfilter to limit EditText
- Unity3d RPG implementation (medium)
- Captura下载安装及在Captura配置FFmpeg
- Application of derivative in daily question
- Latest version of NPM: the "NPM" item cannot be recognized as the name of a cmdlet, function, script file, or runnable program. Please check
- [combinatorics] number of solutions of indefinite equations (number of combinations of multiple sets R | number of non negative integer solutions of indefinite equations | number of integer solutions
- Lvgl usage experience
- Pytoch lightweight visualization tool wandb (local)
- numpy之 警告VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences
猜你喜欢

Makefile demo

docker安装及启动mysql服务

Summary of determinant knowledge points in Chapter 1 of Linear Algebra (Jeff's self perception)

The calculation of stripe, kernel and padding in CNN

Elsevier latex submitted the article pdftex def Error: File `thumbnails/cas-email. jpeg‘ not found: using draf

Vs 2019 installation and configuration opencv

ffmpeg下载安装教程及介绍

别再用 System.currentTimeMillis() 统计耗时了,太 Low,StopWatch 好用到爆!

MongoDB简介

FileZilla Client下載安裝
随机推荐
Vs 2019 configure tensorrt to generate engine
C programming learning notes [edited by Mr. Tan Haoqiang] (Chapter III sequence programming) 03 operators and expressions
Limit of one question per day
Change and access of median value of listening object
Vs 2019 configuration du moteur de génération de tensorrt
C语言HashTable/HashSet库汇总
渤、黄海的潮汐特征
Summary of determinant knowledge points in Chapter 1 of Linear Algebra (Jeff's self perception)
node 开启服务器
PHP generates PDF tcpdf
静态网页 和 动态网页的区别 & WEB1.0和WEB2.0的区别 & GET 和 POST 的区别
403 error displayed when vs cloning
Learning notes of C programming [compiled by Mr. Tan Haoqiang] (Chapter III sequence programming) 04 C sentence
com.fasterxml.jackson.databind.exc.InvalidFormatException问题
Limit of one question per day
ffmpeg之 一张/多张图片合成视频
[algebraic structure] group (definition of group | basic properties of group | proof method of group | commutative group)
Lvgl usage experience
C # webrequest post mode, based on "basic auth" password authentication mode, uploads files and submits other data using multipart / form data mode
Ffmpeg one / more pictures synthetic video