前两节,只是强迫自己再现Springboot项目搭建的过程,增强记忆,熟悉一下SpringBoot的使用;
后面做的是 实现秒杀的业务逻辑 + 优化。
业务逻辑就是 增删改查了,没什么好说的。
但是优化,相较于以前在学校做的增删改查,能打开一个新的视野,对业务处理也会有一个更深的认识。
并且这些经验思想 可以在任何一个项目 复用。
就像一段好的基础框架代码(见Unity开发中的 缓存池),复制到任何一个项目,都能起到很大的基础构建作用。
下面是实际操作过的 优化动作, 最后有一个 视野更大 但是没实践过(很虚)的思路小结。
做过的优化
1、 缓存
用于读取多,变更少场景。 主要应对并发读。
一般用于前端展示中。
2、服务角度
目的: 减少数据库操作、减少redis操作。
思想:将读取的数据 缓存起来
3、接口安全性保障
- 秒杀接口地址隐藏
防止接口暴露,被脚本频繁访问 - 验证码
也是阻止脚本顺畅进行,设一道门坎 - 接口限流
接口限流比较实用;防止脚本级别才能做出的 频繁访问
1、缓存
(1)html缓存
应用: 一般用于列表展示。
思路: 将整个html页面放入 redis缓存中,加一个过期时间(比如60s),后续再次访问的时候,就直接从redis拿取页面数据,返回到 浏览器。
为什么: 所有用户都会访问 商品列表,所以是频繁访问;且修改只有内部人员在修改商品时才会修改,所以有一个 60s失效时间是可以忍受的,或者再更新的时候更新redis数据。
注意: 一般只缓存列表前 几十页,因为后面的页面很少被访问。
优化提升: (访问数据库得到列表的时间 - 访问redis缓存得到html页面的时间)* 访问量。
缺点: 传输的是 整个 html页面,所以也有重复的数据(静态资源),见下面的优化。
(2)对象缓存(前后端分离)
引导: 在前后端分离的 http请求中, 数据传输可以看作两部分: 静态的html页面 + html页面需要渲染的数据。
- 静态的html页面: 可以被视为静态资源 被管理的(Springboot有对静态资源处理),这部分可以保存在客户端的浏览器中,作为缓存。
- 动态的渲染数据:可以通过redis 把它当作对象 缓存起来。
Springboot 配置文件 静态资源管理: