瓶頸在數據庫。
解決辦法加緩存。
緩存:
1.用戶在發送請求時使用頁面的靜態化,把頁面緩存在客戶端
2.請求還沒有到達網站之前可以部署CDN節點,讓請求首先訪問CDN
3.可以使用Nginx緩存
4.接着在使用頁面級緩存在詳細點可以使用對象緩存
1.頁面緩存+URL緩存+對象緩存
- 1.取緩存
- 2.手動渲染模版
- 3.結果輸出
/**
* 使用頁面緩存技術
*
* @param model
* @param user
* @return
* @throws Exception
**/
@RequestMapping(value = "/to_list", produces = "text/html")
@ResponseBody
public String list(Model model, MiaoshaUser user, HttpServletResponse response, HttpServletRequest request) {
//查詢商品列表
List<GoodsVo> goodsList = goodsService.listGoodsVo();
model.addAttribute("goodsList", goodsList);
String html = redisService.get(GoodsKey.getGoodsList, "", String.class);
//取緩存
if (!StringUtils.isEmpty(html)) {
return html;
}
//手動渲染
WebContext webContext = new WebContext(request,response,request.getServletContext(),request.getLocale(),model.asMap());
html = thymeleafViewResolver.getTemplateEngine().process("goods_list", webContext);
if (!StringUtils.isEmpty(html)) {
redisService.set(GoodsKey.getGoodsList,"",html);
}
System.out.println(html);
return html;
}
URL緩存技術 (不同的商品id 有不同緩存)
/**
* 使用URL緩存技術
*
* @param model
* @param user
* @return
* @throws Exception
**/
@RequestMapping(value = "/to_detail/{goodsId}", produces = "text/html")
@ResponseBody
public String detail(Model model, MiaoshaUser user,
@PathVariable("goodsId") long goodsId,HttpServletResponse response, HttpServletRequest request) {
model.addAttribute("user", user);
String html = redisService.get(GoodsKey.getGoodsDetail, ""+goodsId, String.class);
//取緩存
if (!StringUtils.isEmpty(html)) {
return html;
}
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);
model.addAttribute("remainSeconds", remainSeconds);
//手動渲染
WebContext webContext = new WebContext(request,response,request.getServletContext(),request.getLocale(),model.asMap());
html = thymeleafViewResolver.getTemplateEngine().process("goods_detail", webContext);
if (!StringUtils.isEmpty(html)) {
redisService.set(GoodsKey.getGoodsDetail,""+goodsId,html);
}
return html;
}
2.頁面靜態化,前後端分離
3.靜態資源優化
- JS/CSS壓縮,減少流量
- 多個JS/CSS組合,減少鏈接數
使用技術 Nginx 或者 Tengine
- CDN就近訪問
4.CDN優化