Spring Boot缓存实战 Caffeine示例

Spring Boot缓存实战 Caffeine示例

Spring Boot缓存实战 Caffeine示例

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,自动配置将忽略所有泛型类型。

引入依赖

org.springframework.boot

spring-boot-starter-cache

com.github.ben-manes.caffeine

caffeine

2.6.0

开启缓存的支持

使用@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 cacheLoader() {

CacheLoader cacheLoader = new CacheLoader() {

@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 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;

}

}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值