一、页面优化技术
1.1 具体的技术
- 页面缓存 + URL缓存 + 对象缓存
- 页面静态化,前后端分离
- 静态资源优化
- CDN优化
二、页面缓存
2.1 思路
客户端请求的页面,我们先去缓存中去取,前提是客户端请求的页面并未发生改变,取到了返回给客户端,如果缓存中没有所需的页面,就需要我们手动的去渲染页面,然后将渲染好的页面缓存到redis中,然后返回给客户端。
如果我们设置的缓存是60秒,则可以理解我们看到的是60秒以前的东西。
2.2 页面缓存实现
需要注入两个对象:
@Autowired
ThymeleafViewResolver thymeleafViewResolver;
@Autowired
ApplicationContext applicationContext;
@RequestMapping(value = "/to_list",produces = "text/html")
@ResponseBody
public String list(HttpServletRequest request, HttpServletResponse response,Model model,MiaoshaUser miaoshaUser){
model.addAttribute("user",miaoshaUser);
List<GoodsVo> goodsVos = goodsService.selectAll();
model.addAttribute("goodsList",goodsVos);
//取缓存
String html = redisService.get(GoodsKey.getGoodsListCresh, "", String.class);
if(!StringUtils.isEmpty(html)){
return html;
}
//缓存中没有需要手动渲染
WebContext context = new WebContext(request,response,applicationContext,request.getLocale(),model.asMap());
String goods_list = thymeleafViewResolver.getTemplateEngine().process("goods_list", context);
if(!StringUtils.isEmpty(goods_list)){
redisService.set(GoodsKey.getGoodsListCresh,"",goods_list);
}
return goods_list;
}
2.3 测试
页面正常,可以成功进入到Goods_list页面
2.4 对象缓存
将对象添加进缓存中,每次取的时候先从对象中去取。
//先从缓存中去取数,取不到再从数据库中取,再添加到缓存中
public MiaoshaUser getByID(long ID) {
MiaoshaUser miaoshaUser = service.get(MiaoshaUserKey.getByID, "" + ID, MiaoshaUser.class);
if (miaoshaUser != null) {
return miaoshaUser;
} else {
MiaoshaUser select = miaoShaUserDao.select(ID);
if (select != null) {
service.set(MiaoshaUserKey.getByID, "" + ID, select);
return select;
} else {
return null;
}
}
}
三、页面静态化
把页面直接缓存到用户的浏览器上,当用户访问页面时,直接从本地缓存中取,数据通过接口从服务端获取,
3.1 商品详情页面静态化
3.2 商品详情页面静态化思路
<!-- 直接请求静态页面 -->
<td><a th:href="'/goods_detail.htm?goodsId='+${goods.id}">详情</a></td>
点击详情按钮,直接去请求静态页面
静态页面的存放位置:不需要thymeleaf模块引擎的渲染,我们只需要把页面所需的数据传给页面即可。
3.3 页面静态化相关配置
#启用静态资源处理
spring.resources.add-mappings=true
#缓存的时间
spring.resources.cache-period=3600
#查找链上添加缓存
spring.resources.chain.cache=true
spring.resources.chain.enabled=true
#静态页面是否需要压缩
spring.resources.chain.gzipped=true
spring.resources.chain.html-application-cache=true
四、订单详情静态化,解决卖超
1.1 一个用户同时来了两个秒杀请求
解决方法:
- 在下订单的模块,在对应的表上建立唯一索引,在Miaosha_order上,user_id和Goods_id上建立唯一索引。
- 秒杀的过程在事务中进行
1.2 静态资源优化的常用手段
- JS/CSS压缩,减少流量
- 多个JS/CSS组合,减少连接数,一次连接全部下载下来,不需要多次进行连接。
- CDN 内容分发网络,把数据缓存到多个节点上,用户请求时先去最近的节点去取资源,可以解决网络拥堵。
1.3 并发优化的思路
- 浏览器的页面静态化
- 请求部署之前,部署CDN节点
- NGIX
- 应用程序的页面缓存
- 对象缓存