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上找到这里


« 上一篇: Java 字面值