首先跟着楼主来简单了解一下页面缓存的含义:
页面缓存
页面缓存是将动态页面直接生成静态的页面放在服务器端,用户调取相同页面时,静态页面将直接下载到客户端,不再需要通过程序的运行和数据库的访问,大大节约了服务器的负载。每次访问页面时,会检测相应的缓存页面是否存在,若不存在,则连接数据库得到数据渲染页面并生成缓存页面文件,这样下次访问的页面文件就发挥作用了。
接下来楼主将用一个简单的例子来带大家走进页面缓存的世界:
1.假如有一个这样的代码(他的功能是展现商品的列表,这里讲的框架是SpringBoot,前端用的themleaf模板)
@RequestMapping("/goods/to_list")
public String list(Model model, MiaoshaUser user ) {
model.addAttribute("user", user);
// 查询商品列表
List<GoodsVo> goodsList = goodsService.listGoodsVo();
model.addAttribute("goodsList", goodsList);
return "goods_list";
}
我们从上面的代码得知:该代码是查询出商品列表然后转到goods_list.html的前端页面上(配置文件省略),我们可以得知.将goodsList参数通过model传给goods_list页面,这其中是通过SpringBoot框架来进行渲染的.其中牵扯很多代码的运行,比较耗时间;而且每执行这个代码一次,SpringBoot就要渲染一次,非常的麻烦;
2.接下来我们就按照上面的例子作为例子来讲解页面的缓存(使用页面缓存的代码如下:)
@RequestMapping(value = "/goods/to_list", produces = "text/html")
@ResponseBody
public String list(Model model, MiaoshaUser user, HttpServletRequest request, HttpServletResponse response) {
model.addAttribute("user", user);
// 查询商品列表
List<GoodsVo> goodsList = goodsService.listGoodsVo();
model.addAttribute("goodsList", goodsList);
// 使用页面缓存 1.查询redis对应的缓存 2.不存在则写入redis缓存中
// 1.查询redis
String html = redisService.get(GoodsKey.getGoodsList, "", String.class);
if (!StringUtils.isEmpty(html)) {
return html;
}
// 假如redis查询不到数据,则:熏染html(通过SpringBoot的themleafViewResovler接口的实现类SpringWebContext来操作)
SpringWebContext ctx = new SpringWebContext(request, response, request.getServletContext(), request.getLocale(),
model.asMap(), applicationContext);
// 手动进行渲染:thymeleafViewResolver
html = thymeleafViewResolver.getTemplateEngine().process("goods_list", ctx);
// 2.将手动渲染完毕的html存放到redis中
if (!StringUtils.isEmpty(html)) {
redisService.set(GoodsKey.getGoodsList, "", html);
}
return html;
}
我们从上面的代码得知:页面缓存是首先从redis中取出渲染好的页面,如果不存在,那么则自己手动渲染页面一次,再把通过
thymeleafViewResolver渲染好的页面存入到缓存中去!我们设置的页面缓存时间为60s(在配置文件中,这里就省略了),说明多个请求对于这段代码来说,在60s内都只会从缓存中去取,这样大大的提高了效率,节省了很多时间
使用场景:页面缓存多用于变化不明显的页面,比如商品列表等等!