前言
作为一个程序员,优化代码、提升用户体验是一件令人上瘾的事情。
假如现在我们需要加快网页加载速度,提高我们网站的吞吐量,那么实现这一目的的有效途径之一,就是缓存。在缓存当道的现在,几乎无处不在使用缓存,有浏览器端的缓存,有服务器端的缓存,有代理服务器的缓存,有ASP.NET页面缓存,对象缓存。数据库也有缓存。
这次就来介绍一下页面缓存和对象缓存。
正文
页面缓存
这种缓存技术一般用于不会经常变动信息,并且访问次数较多的页面,这样就不用每次都动态加载。
将页面在后端通过模板引擎进行解析,将生成的html文件存入redis缓存中。当前端第一次请求该页面数据时有服务端通过引擎生成,之后就从缓存中获取。
这种缓存主要用来应对短时间有大量对同一资源的请求,因此缓存有效期并不会设置的太长。
主要步骤是:1.取缓存 ()2.手动渲染 3.结果输出
举个栗子。
商品列表一般变化不大,我们就可以采用这个方式来页面缓存。展示一下返回商品列表页面的写法。
@RequestMapping(value = "/to_list", produces = "text/html")
@ResponseBody
public String toList(HttpServletRequest request, HttpServletResponse response,
Model model, MiaoshaUser user) {
//model中设置user对象
model.addAttribute("user", user);
//页面缓存:对用户请求过的页面进行缓存,使得下一次对相同资源的请求从缓存中读取。
//取缓存,如果当前缓存中已经有此页面,直接返回该页面html数据
String html = redisService.get(GoodsKey.getGoodsList, "", String.class);
if (!StringUtils.isEmpty(html)) {
return html;
}
//查询商品列表
List<GoodsVo> goodsVoList = goodsService.listGoodsVo();
model.addAttribute("goodsList", goodsVoList);
// return "goods_list";
//如果没有此页面的缓存,就生成、写入缓存、返回
SpringWebContext springWebContext = new SpringWebContext(request, response,
request.getServletContext(), request.getLocale(), model.asMap(), applicationContext);
//手动渲染
html = thymeleafViewResolver.getTemplateEngine().process("goods_list", springWebContext);
if (!StringUtils.isEmpty(html)) {
redisService.set(GoodsKey.getGoodsList, "", html); //有效时间60s
}
return html;
}
对象缓存
这是一个粒度更细的缓存。
有些使用率较高的对象,我们可以将其缓存起来,使用时直接从缓存中取,而不用去重复进行查询数据库、包装对象的步骤。比如说,我们在进行登录、改密码、查看购物车等操作时都会获取user数据,进行比较或是修改。那么我们就可以封装一个方法来专门获取user对象,并且优先从缓存中获取,只有缓存中没有的时候才会去查询数据库。这样就会提升一些性能。
要注意的是更新操作,如果对缓存数据在数据库中的对应数据进行了更新,那么我们的缓存也是要同步更新的。如果我们写的代码逻辑不对,那么就会出现问题:在同一时间有一个查询操作和一个更新操作,就有可能出现查询出来的数据不是最新,或是缓存中的数据是脏数据的情况。
因此,如何保证数据库和缓存的一致性就是一个重点。
关于正确地进行缓存更新,我放一篇文章在这里,讲的很详细。
URL缓存
URL缓存,有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的。使用情景类似于页面缓存。
当Web请求抵达缓存时,如果本地有“已缓存的”副本,就可以从本地存储设备而不是从原始服务器中提取这个文档。
http缓存的好处是显而易见的,比如:
-
减少了冗余的数据传输,节省了网费。
-
减少了服务器的负担,大大提高了网站的性能
-
加快了客户端加载网页的速度
只需要在springboot的配置文件里配置一下spring.resources即可。
spring:
# static
resources:
add-mappings: true # 启用静态资源处理
chain:
cache: true # 查询链的缓存
enabled: true
gzipped: true # 对静态页面压缩
html-application-cache: true
static-locations: classpath:/static/
cache-period: 3600 # 客户端缓存静态资源的时间
结尾
缓存这部分,东西还是很多的,我会分几篇文章细细道来。