1. 概述
在这个教程中,我们将为一些基本的现实世界示例进行缓存配置。我们将展示如何设置这个缓存机制的时间限制,我们也将这种时间限制称为缓存过期时间(Time-to-Live,TTL)。
2. Spring 缓存的配置
之前,我们已经演示了如何使用Spring的@Cacheable注解。在实践中,当一个酒店预订网站的主页频繁打开时,缓存就变得很有用。这意味着提供酒店列表的REST端点经常被请求,频繁地访问数据库。相比之下,直接从内存提供数据比数据库查询更快。
首先,我们将创建SpringCachingConfig
:
@Configuration
@EnableCaching
public class SpringCachingConfig {
@Bean
public CacheManager cacheManager() {
return new ConcurrentMapCacheManager("hotels");
}
}
还需要SpringCacheCustomizer
:
@Component
public class SpringCacheCustomizer implements CacheManagerCustomizer<ConcurrentMapCacheManager> {
@Override
public void customize(ConcurrentMapCacheManager cacheManager) {
cacheManager.setCacheNames(asList("hotels"));
}
}
3. @Cacheable 缓存
配置完成后,我们可以利用Spring的配置来减少REST端点的响应时间,将酒店对象存储在内存中。如下面代码片段所示,我们使用@Cacheable
注解来缓存酒店列表:
@Cacheable("hotels")
public List<Hotel> getAllHotels() {
return hotelRepository.getAllHotels();
}
4. 设置@Cacheable的TTL
然而,随着时间的推移,数据库中的酒店列表可能会因为更新、删除或添加而发生变化。我们希望在首次调用上述第3部分方法后,通过设置时间到过期(TTL)来刷新缓存。这可以通过使用@CacheEvict
注解实现。例如,在下面的例子中,我们通过caching.spring.hotelListTTL
变量设置TTL:
@CacheEvict(value = "hotels", allEntries = true)
@Scheduled(fixedRateString = "${caching.spring.hotelListTTL}")
public void emptyHotelsCache() {
logger.info("emptying Hotels cache");
}
我们希望TTL为12小时,以毫秒为单位的值为12 x 3600 x 1000 = 43200000。我们将在环境属性中定义这个值。如果使用基于属性的环境配置,可以这样设置缓存TTL:
caching.spring.hotelListTTL=43200000
另外,如果使用YAML设计,可以设置为:
caching:
spring:
hotelListTTL: 43200000
5. 总结
在这篇文章中,我们探讨了如何为基于Spring的缓存设置TTL。完整的代码可以在GitHub上找到这里。