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,barspring.cache.caffeine.spec=maximumSize=500,expireAfterAccess=600s
除此之外,如果定义了com.github.benmanes.caffeine.cache.CacheLoader,它会自动关联到CaffeineCacheManager。由于该CacheLoader将关联被该缓存管理器管理的所有缓存,所以它必须定义为CacheLoader
引入依赖
<dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-cacheartifactId>dependency><dependency><groupId>com.github.ben-manes.caffeinegroupId><artifactId>caffeineartifactId><version>2.6.0version>dependency>
开启缓存的支持
使用@EnableCaching注解让Spring Boot开启对缓存的支持
@SpringBootApplication@EnableCaching// 开启缓存,需要显示的指定public class SpringBootStudentCacheCaffeineApplication {publicstaticvoidmain(String[] args) {SpringApplication.run(SpringBootStudentCacheCaffeineApplication.class, args);
}
}
配置文件
新增对缓存的特殊配置,如最大容量、过期时间等
spring.cache.cache-names=peoplespring.cache.caffeine.spec=initialCapacity=50,maximumSize=500,expireAfterWrite=10s,refreshAfterWrite=5s
如果使用了refreshAfterWrite配置还必须指定一个CacheLoader,如:
/**
* 必须要指定这个Bean,refreshAfterWrite=5s这个配置属性才生效
*
* @return
*/@BeanpublicCacheLoader<Object,Object> cacheLoader() {
CacheLoader<Object,Object> cacheLoader =newCacheLoader<Object,Object>() {@OverridepublicObjectload(Objectkey) throws Exception {returnnull;
}// 重写这个方法将oldValue值返回回去,进而刷新缓存@OverridepublicObjectreload(Objectkey,ObjectoldValue) throws Exception {returnoldValue;
}
};returncacheLoader;
}
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不可以同时使用
示例代码
/**
*@authoryuhao.wang
*/@ServicepublicclassPersonServiceImplimplementsPersonService{privatestaticfinalLogger logger = LoggerFactory.getLogger(PersonServiceImpl.class);@AutowiredPersonRepository personRepository;@Override@CachePut(value ="people", key ="person.id")publicPerson save(Person person) {
Person p = personRepository.save(person);
logger.info("为id、key为:"+ p.getId() +"数据做了缓存");returnp;
}@Override@CacheEvict(value ="people")//2publicvoid remove(Longid) {
logger.info("删除了id、key为"+ id +"的数据缓存");//这里不做实际删除操作}/**
* Cacheable
* value:缓存key的前缀。
* key:缓存key的后缀。
* sync:设置如果缓存过期是不是只放一个请求去请求数据库,其他请求阻塞,默认是false。
*/@Override@Cacheable(value ="people", key ="person.id", sync = true)publicPerson findOne(Person person, String a, String[] b, List<Long> c) {
Person p = personRepository.findOne(person.getId());
logger.info("为id、key为:"+ p.getId() +"数据做了缓存");returnp;
}@Override@Cacheable(value ="people1")//3publicPerson findOne1() {
Person p = personRepository.findOne(2L);
logger.info("为id、key为:"+ p.getId() +"数据做了缓存");returnp;
}@Override@Cacheable(value ="people2")//3publicPerson findOne2(Person person) {
Person p = personRepository.findOne(person.getId());
logger.info("为id、key为:"+ p.getId() +"数据做了缓存");returnp;
}
}
参考:
- 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 工程
作者:xiaolyuh链接:https://www.jianshu.com/p/c72fb0c787fc来源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
声明:本文部分素材转载自互联网,如有侵权立即删除 。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
丞旭猿论坛
暂无评论内容