Spring Boot缓存实战 Caffeine示例
程序员文章站
2022-06-21 16:06:52
caffeine和spring boot集成
caffeine是使用java8对guava缓存的重写版本,在spring boot 2.0中将取代guava。如果出现ca...
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>() { @override public object load(object key) throws exception { return null; } // 重写这个方法将oldvalue值返回回去,进而刷新缓存 @override public 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); @autowired personrepository 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")//2 public 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")//3 public person findone1() { person p = personrepository.findone(2l); logger.info("为id、key为:" + p.getid() + "数据做了缓存"); return p; } @override @cacheable(value = "people2")//3 public person findone2(person person) { person p = personrepository.findone(person.getid()); logger.info("为id、key为:" + p.getid() + "数据做了缓存"); return p; } }
源码:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
spring boot从redis取缓存发生java.lang.ClassCastException异常
-
Spring Boot 2整合Redis做缓存
-
详解Spring Boot配置使用Logback进行日志记录的实战
-
详解Spring Boot实战之Filter实现使用JWT进行接口认证
-
使用Spring Boot集成FastDFS的示例代码
-
spring boot aop 记录方法执行时间代码示例
-
Spring Boot与Spark、Cassandra系统集成开发示例
-
详解Spring Boot实战之单元测试
-
Spring Boot2(二):使用Spring Boot2集成Mybatis缓存机制
-
Spring实战之使用XML方式管理声明式事务操作示例