使用缓存的目的就是提高性能,今天码哥带大家实践运用 spring-boot-starter-cache
抽象的缓存组件去集成本地缓存性能之王 Caffeine
。
大家需要注意的是: in-memeory
缓存 只适合在单体应用,不适合与分布式环境 。
分布式环境的情况下需要将缓存修改同步到每个节点,需要一个同步机制保证每个节点缓存数据最终一致。
Spring Cache 是什么
不使用 Spring Cache 抽象的缓存接口,我们需要根据不同的缓存框架去实现缓存,需要在对应的代码里面去对应缓存加载、删除、更新等。
比如查询我们使用 旁路缓存策略 :先从缓存中查询数据,如果查不到则从数据库查询并写到缓存中。
伪代码如下:
public User getUser(long userId) { // 从缓存查询 User user = cache.get(userId); if (user != null) { return user; } // 从数据库加载 User dbUser = loadDataFromDB(userId); if (dbUser != null) { // 设置到缓存中 cache.put(userId, dbUser) } return dbUser; }
我们需要写大量的这种繁琐代码,Spring Cache 则对缓存进行了抽象,提供了如下几个注解实现了缓存管理:
- @Cacheable :触发缓存读取操作,用于查询方法上,如果缓存中找到则直接取出缓存并返回,否则执行目标方法并将结果缓存。
- @CachePut :触发缓存更新的方法上,与
Cacheable
相比,该注解的方法始终都会被执行,并且使用方法返回的结果去更新缓存,适用于 insert 和 update 行为的方法上。 - @CacheEvict :触发缓存失效,删除缓存项或者清空缓存,适用于 delete 方法上。
除此之外,抽象的 CacheManager
既能集成基于本地内存的单体应用,也能集成 EhCache、Redis
等缓存服务器。
最方便的是通过一些简单配置和注解就能接入不同的缓存框架,无需修改任何代码。
集成 Caffeine
码哥带大家使用注解方式完成缓存操作的方式来集成,完整的代码请访问 github : https://github.com/MageByte-Zero/springboot-parent-pom,在 pom.xml
文件添加如下依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <de