springboot优化之redis页面缓存
对于一些不经常改变的页面,比如商品详情页,我们可以做静态化提升访问速度。
本文介绍另一种页面缓存实现策略,将页面缓存至redis中,从而减少对库的访问,提升访问速度。
代码
@RequestMapping(value="/to_list", produces="text/html")
@ResponseBody
public String list(HttpServletRequest request, HttpServletResponse response, Model model,MiaoshaUser user) {
model.addAttribute("user", user);
//取缓存
String html = redisService.get(GoodsKey.getGoodsList, "", String.class);
if(!StringUtils.isEmpty(html)) {
return html;
}
List<GoodsVo> goodsList = goodsService.listGoodsVo();
model.addAttribute("goodsList", goodsList);
SpringWebContext ctx = new SpringWebContext(request,response,
request.getServletContext(),request.getLocale(), model.asMap(), applicationContext );
//手动渲染
String html = thymeleafViewResolver.getTemplateEngine().process("goods_list", ctx);
if(!StringUtils.isEmpty(html)) {
redisService.set(GoodsKey.getGoodsList, "", html);
}
return html;
}
解释
首先我们从redis中取页面缓存,如果能取到直接返回。
如果redis中不存在缓存则需要我们手动渲染,即
SpringWebContext ctx = new SpringWebContext(request,response,
request.getServletContext(),request.getLocale(), model.asMap(), applicationContext );
//手动渲染
String html = thymeleafViewResolver.getTemplateEngine().process("goods_list", ctx);
这里利用thymleaf的视图解析器获取到了对应的模板引擎,手动的对模型进行了渲染。将得到的html存入缓存同时返回页面。
model.asMap()
这个参数为页面模板中的参数,因此前面需要通过model.setAttribute()进行模板参数的填充
thymeleafViewResolver.getTemplateEngine().process("goods_list", ctx);
这里解析的模板名称即默认下我们要返回的模板名称,直接传入即可。
注意 @RequestMapping需要添加produces=”text/html”属性标记返回的媒体格式为html文档。