页面优化技术
- 页面缓存
为了提高访问速度,减少对数据库的访问。通过缓存html页面,客户端请求从缓存中获取,没有再手动渲染。
- 页面静态化
实现前后端分离,客户端第一次访问页面,把页面缓存在客户端的浏览器上,再次访问时,就不需要和服务器交互。直接从本地缓存中获取,节约了用户的流量。
- 静态资源优化
- CND优化
页面缓存
当访问goods_list页面时,如果缓存中有,就取出返回这个html;如果没有就获取数据库中的数据,渲染模板,再返回前端之前保存到缓存中。再次获取时,只要缓存中存的这个页面还没过期,就可以直接返回给前端。
@RequestMapping(value = "/to_list",produces = "text/html")
@ResponseBody
public String list(HttpServletRequest request, HttpServletResponse response,Model model, MiaoshaUser user){
model.addAttribute("user",user);
// return "goods_list";
//取缓存
String html = redisService.get(GoodsKey.getGoodsList,"",String.class);
if (!StringUtils.isEmpty(html)){
return html;
}
//查询商品列表
List<GoodsVo> goodsList = goodsService.listGoodsVo();
model.addAttribute("goodsList",goodsList);
//手动渲染
WebContext ctx = new WebContext(request, response, request.getServletContext(), request.getLocale(), model.asMap());
html = thymeleafViewResolver.getTemplateEngine().process("goods_list", ctx);
// SpringWebContext ctx = new SpringWebContext(request,response,request.getServletContext(),
// request.getLocale(),model.asMap(),applicationContext);
// html =thymeleafViewResolver.getTemplateEngine().process("goods_list",ctx);
if (!StringUtils.isEmpty(html)){
redisService.set(GoodsKey.getGoodsList,"",html);
}
return html;
}
页面静态化
127.0.0.1:6379> keys GoodsKey:gl
1) "GoodsKey:gl"
前面缓存了商品详情页面,现在做一个页面静态化,前端只要后端传数据就可以。
- 定义一个GoodsDetailVo封装来专门给页面传值
public class GoodsDetailVo {
private int miaoshaStatus = 0;
private int remainSeconds = 0;
private GoodsVo goods;
private MiaoshaUser user;
public int getMiaoshaStatus() {
return miaoshaStatus;
}
public void setMiaoshaStatus(int miaoshaStatus) {
this.miaoshaStatus = miaoshaStatus;
}
public int getRemainSeconds() {
return remainSeconds;
}
public void setRemainSeconds(int remainSeconds) {
this.remainSeconds = remainSeconds;
}
public GoodsVo getGoods() {
return goods;
}
public void setGoods(GoodsVo goods) {
this.goods = goods;
}
public MiaoshaUser getUser() {
return user;
}
public void setUser(MiaoshaUser user) {
this.user = user;
}
}
2. 把数据放在GoodsDetailVo对象中传给前端
```java
@RequestMapping(value="/detail/{goodsId}")
@ResponseBody
public Result<GoodsDetailVo> detail(HttpServletRequest request, HttpServletResponse response, Model model, MiaoshaUser user, @PathVariable("goodsId")long goodsId) {
GoodsVo goods = goodsService.getGoodsVoByGoodsId(goodsId);
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;
}
GoodsDetailVo vo = new GoodsDetailVo();
vo.setGoods(goods);
vo.setUser(user);
vo.setRemainSeconds(remainSeconds);
vo.setMiaoshaStatus(miaoshaStatus);
return Result.success(vo);
}
}
``
- 秒杀静态化:把之前的返回订单详情页面,改成秒杀成功返回订单信息,失败返回失败信息。
@RequestMapping(value = "/do_miaosha",method = RequestMethod.POST)
@ResponseBody
public Result<OrderInfo> miaosha(Model model, MiaoshaUser user,
@RequestParam("goodsId")long goodsId) {
model.addAttribute("user",user);
if (user == null){
return Result.error(CodeMsg.SESSION_ERROR);
}
//判断库存
GoodsVo goods = goodsService.getGoodsVoByGoodsId(goodsId);
int stock = goods.getStockCount();
if (stock <= 0){
return Result.error(CodeMsg.MIAO_SHA_OVER);
// model.addAttribute("errmsg", CodeMsg.MIAO_SHA_OVER.getMsg());
// return "miaosha_fail";
}
//判断是否已经秒杀过
MiaoshaOrder order = orderService.getMiaoshaOrderByUserIdGoodsId(user.getId(),goodsId);
if (order != null){
return Result.error(CodeMsg.REPEATE_MIAOSHA);
// model.addAttribute("errmsg",CodeMsg.REPEATE_MIAOSHA.getMsg());
// return "miaosha_fail";
}
//减库存 下订单 写入秒杀订单
OrderInfo orderInfo = miaoshaService.miaosha(user,goods);
return Result.success(orderInfo);
// model.addAttribute("orderInfo",orderInfo);
// model.addAttribute("goods",goods);
// return "order_detail";
}
}