文章目录
优化思路
- 页面缓存+ URL缓存+对象缓存
- 页面静态化,前后端分离
- 静态资源优化
- CDN优化
(一)页面缓存+ URL缓存+对象缓存
redis缓存详情页
(1)页面缓存:商品列表
- 取缓存
- 手动渲染模版
- 结果输出
访问一个页面的时候不是直接系统渲染,而是从缓存里面取,缓存里面没有才去渲染(同时缓存到redis当中)
以goods_list为例:
因为要把goodsList存到redis当中,所以在redis包中new一个class:
/* GoodsController */
//原本是这样的
@RequestMapping("to_list")
public String list(Model model,MiaoshaUser user){
model.addAttribute("user",user);
List<GoodsVo> listGoodsVo = goodsService.listGoodsVo();
model.addAttribute("goodsList",listGoodsVo);
return "goods_list";
}
//变成这样
@Autowired
ThymeleadViewResolver thymeleadViewResolver;
@Autowired
ApplicationContext applicationContext;
@RequestMapping(value="to_list",produces="text/html")
@ResponseBody
public String list(Model model,MiaoshaUser user){
model.addAttribute("user",user);
//从缓存里面先取出来
String html = redisService.get(GoodsKey.getGoodsList, "", String.class);
//如果不为空就直接返回
if(!StringUtils.isEmpty(html)){
return html;
}
List<GoodsVo> listGoodsVo = goodsService.listGoodsVo();
model.addAttribute("goodsList",listGoodsVo);
//return "goods_list";
//否则需要手动渲染
WebContext ctx = new WebContext( request, response, request.getServletContext(), request.getLocale(),model.asMap());
html = thymeleafViewResolver.getTemplateEngine().process("goods_list",ctx);
if(StringUtils.isEmpty(html)){
redisService.set(GoodsKey.getGoodsList,"",html);
}
return html;
}
手动渲染的时候,我们需要利用
thymeleafViewResolver.getTemplateEngine().process(String templates, webContext ctx)
这个方法
首先要生成WebContext
WebContext ctx = new WebContext( request, response, request.getServletContext(), request.getLocale(),model.asMap());
再传入到上面那个方法里面就可以了
注意点
-
页面有效期比较短,所以需要修改KeyPrefix中的expireSeconds
package com.pro.miaosha.redis; public class GoodsKey extends BasePrefix{ private GoodsKey(int expireSeconds,String prefix) { super(expireSeconds,prefix); } public static GoodsKey getGoodsList = new GoodsKey(60,"gl");//这里设置时间为60s }
-
验证:访问完http://localhost:8080/goods/to_list之后查看redis发现已经被缓存了
(2) URL缓存:商品详情
商品详情页面:
//原本是这样的
@RequestMapping("/to_detail/{goodsId}")
public String detail(
Model model ,
MiaoshaUser user,
@PathVariable("goodsId")long goodsId
) {
model.addAttribute("user",user);
GoodsVo goods = goodsService.getGoodsVoByGoodsId(goodsId);
model.addAttribute("goods",goods);
long startAt = goods.getStartDate().getTime();
long endAt = goods.getEndDate().getTime();
long now = System.currentTimeMillis();
int miaoshaStatus = 0;
int remainSeconds = 0;
if(now < startAt) {
miaoshaStatus = 0;
remainSeconds = (int)((startAt-now)/1000);
}
else if(now > endAt) {
miaoshaStatus = 2;
remainSeconds = -1;
}
else {
miaoshaStatus = 1;
remainSeconds = 0;
}
model.addAttribute("miaoshaStatus",miaoshaStatus);