spring autoconfiguer
@Bean
CaffeineCacheManager cacheManager(CacheProperties cacheProperties,
CacheManagerCustomizers customizers,
ObjectProvider<Caffeine<Object, Object>> caffeine,
ObjectProvider<CaffeineSpec> caffeineSpec,
ObjectProvider<CacheLoader<Object, Object>> cacheLoader
) {
CaffeineCacheManager cacheManager = createCacheManager(cacheProperties, caffeine, caffeineSpec, cacheLoader);
List<String> cacheNames = cacheProperties.getCacheNames();
if (!CollectionUtils.isEmpty(cacheNames)) {
cacheManager.setCacheNames(cacheNames);
}
return customizers.customize(cacheManager);
}
从配置中看,需要配置的Bean有caffeine,caffeineSpec和cacheLoader;
cacheProperties可以替代caffeineSpec;
如果配置有caffeine的时候,也就不需要cacheLoader和caffeineSpec;
因此来看主要有两种配置方法
- 配置Caffeine
- 配置CacheLoader 和(caffeineSpec、CacheProperties其中一个)
因为caffeine规范中有的没有办法在spec中配置(例如Scheduler),所有建议配置Caffeine;
实战
/**
* @author rxw
* <p>description: 配置Caffeine
*/
@EnableCaching
@SpringBootConfiguration
@Slf4j
public class CaffeineConfiguration {
@Bean
public Caffeine<Object,Object> caffeine() {
return Caffeine.newBuilder()
.initialCapacity(50)
.maximumSize(50_000)
// .expireAfterWrite(10, TimeUnit.SECONDS)
.expireAfterAccess(10,TimeUnit.SECONDS)
// 一下步骤只能在Caffeine中配置,所以建议配置Caffeine
.scheduler(Scheduler.systemScheduler())
.evictionListener((k,v,cause) -> {
log.info("eviction" + String.valueOf(k));
log.info("eviction" + JSON.toJSONString(v));
log.info("eviction" + String.valueOf(cause.wasEvicted()));
})
.removalListener((k,v,cause) -> {
log.info("remova" + String.valueOf(k));
log.info("remova" + JSON.toJSONString(v));
log.info("remova" + String.valueOf(cause.wasEvicted()));
});
}
}
@Service
@CacheConfig(cacheNames = "student")
public class StudentServiceImpl implements IStudentService {
@Cacheable(cacheNames = "-",key = "#id",unless = "#id > 1000")
@Override
public Student getById(Long id) {
String string = UUID.randomUUID().toString();
Student student = new Student();
student.setId(id);
student.setName(string);
return student;
}
@CachePut(cacheNames = "-",key = "#id",unless = "#id > 1000" )
@Override
public Student updateById(Long id, Student student) {
student.setId(id);
return student;
}
@CacheEvict(cacheNames = "-",key = "#id")
@Override
public void deleteById(Long id) {
}
}
新发现
@CachePut
:把key和value进行缓存,如果已经有缓存则修改缓存
当使用该注解修改缓存的时候会触发removalListener
,因此removalListener
中不建议有其他的操作。