在实际开发中,对于要反复读取的数据,最好的处理方式是将之在内存中缓存一份,频繁的数据库访问会造成程序效率低下,很容易把数据库搞挂掉,同时内存的读写速度本身就要强于硬盘。下面介绍在Spring Boot如何解决数据缓存问题。本博客是以初识在Spring Boot+JPA为基础的。

 

思路:1.添加依赖 2.在启动类开启缓存 3.在具体方法上配置缓存

 

第一步:添加依赖

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency>
 

第二步:在springboot主函数类开启缓存,只需要加@EnableCaching即可。在Spring Boot中通过@EnableCaching注解自动化配置合适的缓存管理器(CacheManager),Spring Boot根据下面的顺序去侦测缓存提供者:

  • Generic
  • JCache (JSR-107)
  • EhCache 2.x
  • Hazelcast
  • Infinispan
  • Redis
  • Guava
  • Simple
除了按顺序侦测外,我们也可以通过配置属性spring.cache.type来强制指定。我们可以通过debug调试查看cacheManager对象的实例来判断当前使用了什么缓存。

 

@EnableCaching public class DemoApplication {Xxx}
第三步:在service中配置缓存。本文使用JPA完成增删改查,也可以在repository里面进行配置,效果一样。2种配置下面都有例子。

在service中配置如下:

/** * CachePut 将结果放进缓存 * @param id * @return */ @CachePut(value = "user", key = "#id") public User addUser(Integer id) { User user = new User(); user.setUsername("小红"); user.setBirthday(new Date()); userService.addUser(user); System.out.println("添加了缓存id为" + id + "的缓存"); return user; }

/**

  • CacheEvict 意思是删除缓存 * @param id */ @CacheEvict(value = "user", key = "#id") public void deleteUser(Integer id) { System.out.println("删除key为" + id + "的缓存"); }

/**

  • Cacheable 如果缓存中有值,从缓存中获取,否则从数据库查询并把结果放缓存中 * @param id * @return */ @Cacheable(value = "user", key = "#id") public User queryUser(Integer id) { System.out.println("进入selectUser,id:" + id); return userService.selectUser(id); }
 

 

在repository配置如下:

@CacheConfig(cacheNames = "users") public interface UserRepository extends JpaRepository<User, Integer> {

@Cacheable User findById(Integer id);}

 

需要注意的地方:

  • 缓存是缓存方法的返回值,比如User findById这个方法是缓存查询到的user对象,如果此处返回void则缓存无数据。
  • 添加缓存注解在方法上面或者类上面,一般是在service实现类中,或者dao的实现类,或者repository里。不是在
下面附上常用注解和意义: