当前位置: 代码迷 >> 综合 >> Spring Boot缓存实战 Caffeine
  详细解决方案

Spring Boot缓存实战 Caffeine

热度:99   发布时间:2023-10-17 16:05:48.0

Caffeine和Spring Boot集成

Caffeine是使用Java8对Guava缓存的重写版本,在Spring Boot 2.0中将取代Guava。如果出现Caffeine,CaffeineCacheManager将会自动配置。使用spring.cache.cache-names属性可以在启动时创建缓存,并可以通过以下配置进行自定义(按顺序):

  • spring.cache.caffeine.spec: 定义的特殊缓存
  • com.github.benmanes.caffeine.cache.CaffeineSpec: bean定义
  • com.github.benmanes.caffeine.cache.Caffeine: bean定义

例如,以下配置创建一个foo和bar缓存,最大数量为500,存活时间为10分钟:

spring.cache.cache-names=foo,bar
spring.cache.caffeine.spec=maximumSize=500,expireAfterAccess=600s

除此之外,如果定义了com.github.benmanes.caffeine.cache.CacheLoader,它会自动关联到CaffeineCacheManager。由于该CacheLoader将关联被该缓存管理器管理的所有缓存,所以它必须定义为CacheLoader<Object, Object>,自动配置将忽略所有泛型类型。

引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>2.6.0</version>
</dependency>

开启缓存的支持

使用@EnableCaching注解让Spring Boot开启对缓存的支持

@SpringBootApplication
@EnableCaching// 开启缓存,需要显示的指定
public class SpringBootStudentCacheCaffeineApplication {public static void main(String[] args) {SpringApplication.run(SpringBootStudentCacheCaffeineApplication.class, args);}
}

配置文件

新增对缓存的特殊配置,如最大容量、过期时间等

spring.cache.cache-names=people
spring.cache.caffeine.spec=initialCapacity=50,maximumSize=500,expireAfterWrite=10s,refreshAfterWrite=5s

如果使用了refreshAfterWrite配置还必须指定一个CacheLoader,如:

/*** 必须要指定这个Bean,refreshAfterWrite=5s这个配置属性才生效** @return*/
@Bean
public CacheLoader<Object, Object> cacheLoader() {CacheLoader<Object, Object> cacheLoader = new CacheLoader<Object, Object>() {@Overridepublic Object load(Object key) throws Exception {return null;}// 重写这个方法将oldValue值返回回去,进而刷新缓存@Overridepublic Object reload(Object key, Object oldValue) throws Exception {return oldValue;}};return cacheLoader;
}

Caffeine配置说明:

  • initialCapacity=[integer]: 初始的缓存空间大小
  • maximumSize=[long]: 缓存的最大条数
  • maximumWeight=[long]: 缓存的最大权重
  • expireAfterAccess=[duration]: 最后一次写入或访问后经过固定时间过期
  • expireAfterWrite=[duration]: 最后一次写入后经过固定时间过期
  • refreshAfterWrite=[duration]: 创建缓存或者最近一次更新缓存后经过固定的时间间隔,刷新缓存
  • weakKeys: 打开key的弱引用
  • weakValues:打开value的弱引用
  • softValues:打开value的软引用
  • recordStats:开发统计功能

注意:

  • expireAfterWrite和expireAfterAccess同事存在时,以expireAfterWrite为准。
  • maximumSize和maximumWeight不可以同时使用
  • weakValues和softValues不可以同时使用

示例代码

/*** @author yuhao.wang*/
@Service
public class PersonServiceImpl implements PersonService {private static final Logger logger = LoggerFactory.getLogger(PersonServiceImpl.class);@AutowiredPersonRepository personRepository;@Override@CachePut(value = "people", key = "#person.id")public Person save(Person person) {Person p = personRepository.save(person);logger.info("为id、key为:" + p.getId() + "数据做了缓存");return p;}@Override@CacheEvict(value = "people")//2public void remove(Long id) {logger.info("删除了id、key为" + id + "的数据缓存");//这里不做实际删除操作}/*** Cacheable* value:缓存key的前缀。* key:缓存key的后缀。* sync:设置如果缓存过期是不是只放一个请求去请求数据库,其他请求阻塞,默认是false。*/@Override@Cacheable(value = "people", key = "#person.id", sync = true)public Person findOne(Person person, String a, String[] b, List<Long> c) {Person p = personRepository.findOne(person.getId());logger.info("为id、key为:" + p.getId() + "数据做了缓存");return p;}@Override@Cacheable(value = "people1")//3public Person findOne1() {Person p = personRepository.findOne(2L);logger.info("为id、key为:" + p.getId() + "数据做了缓存");return p;}@Override@Cacheable(value = "people2")//3public Person findOne2(Person person) {Person p = personRepository.findOne(person.getId());logger.info("为id、key为:" + p.getId() + "数据做了缓存");return p;}
}

参考:

  • https://memorynotfound.com/spring-boot-caffeine-caching-example-configuration/

  • http://blog.csdn.net/ClementAD/article/details/53009899

  • http://www.bijishequ.com/detail/419479?p=

  • http://xp-developer.com/html/springboot/IV.%20Spring%20Boot%20features/31.1.8%20Caffeine

源码:
https://github.com/wyh-spring-ecosystem-student/spring-boot-student/tree/releases

spring-boot-student-cache-caffeine 工程

为监控而生的多级缓存框架 layering-cache这是我开源的一个多级缓存框架的实现,如果有兴趣可以看一下


 

  相关解决方案