(九)spring-boot教程,开发个人博客:给博客详情加上缓存功能,让页面打开更迅速

avatar

这一节来说一下spring-boot里的缓存用法

  1. 首先要开启缓存支持,在启动类上 DemoApplication 添加注解 @EnableCaching
  2. 然后在想实现缓存的service类上加上注解 @CacheConfig(cacheNames = "post")
  3. 最后在想被缓存的方法上加上注解 @Cacheable

至此缓存就实现了

我这里对PostService类里的findById()方法做了缓存,然后在PostController方法里加上了两行日志

@Service
@Transactional
@CacheConfig(cacheNames = "post")
public class PostService {
  // 根据博客id,查询出博客以及评论
  @Cacheable
  public Map<String, Object> findById(Integer id) {
    Map<String, Object> map = new HashMap<>();
    Post post = postRepository.findById(id).orElse(null);
    if (post != null) {
      // 查看数+1
      post.setView(post.getView() + 1);
      postRepository.save(post);
      map.put("post", post);
      // 查询出博客下的评论
      List<Comment> comments = commentRepository.findByPostId(id);
      map.put("comments", comments);
    }
    return map;
  }
}
@GetMapping("/{id}")
public String detail(@PathVariable Integer id, Model model) {
  logger.info("开始查询博客详情");
  Map<String, Object> map = postService.findById(id);
  Post post = (Post) map.get("post");
  post.setContent(Jsoup.clean(MDUtil.render(post.getContent()), Whitelist.relaxed()));
  model.addAttribute("post", post);
  model.addAttribute("comments", map.get("comments"));
  logger.info("博客详情查询完成");
  return "post/detail";
}

访问两次博客的详情页,现在来看一下效果,sql语句只发出了一次,第二次就没有发出了,而是从缓存里拿的

qq20181023-210254

清除缓存的注解 @CacheEvict 一般用在删除方法上

spring-boot缓存还可以集成ehcache,redis等作为缓存的提供者,不过这些都要引入额外的包,好处就是可以更灵活的去定制缓存规则

问题

  • @Cacheable 注解的方法名不能相同,相同的话,查询的时候会直接拿第一个被缓存的方法查询出来的数据
  • 被缓存了,一些像实时更新的字段就没办法及时更新了,比如博客的访问量,有个解决办法就是把这个字段放在redis里,写一个定时器固定时间将其同步到数据库里,不过一般要被缓存的数据都是不太需要被更新的数据,也不用太担心这个
目前还没有回答,快来帮帮TA吧!
添加一条评论 请尽量发布对他人有帮助的评论

登录后可发布评论

登录 | Github登录