Spring @Cacheable默认ttl

时间:2017-05-26 13:20:35

标签: spring spring-mvc caching spring-cache

我通常在我的spring-boot应用程序中使用带有缓存配置的var phonecatApp = angular.module('phonecatApp', []); phonecatApp.controller('PhoneListCtrl', function($scope) { $scope.count = 0; $scope.phones = [{ 'name': 'Nexus S', 'snippet': 'Fast just got faster with Nexus S.' }, { 'name': 'Motorola XOOM™ with Wi-Fi', 'snippet': 'The Next, Next Generation tablet.' }, { 'name': 'MOTOROLA XOOM™', 'snippet': 'The Next, Next Generation tablet.' } ]; }); ,并为每个缓存设置特定的TTL(生存时间)。

我最近继承了一个使用@Cacheable的春季启动应用,但没有明确说明缓存管理器和ttl。我将把它改为明确。

但是当没有任何明确的内容时,我无法找出默认值。

我确实看过docs,但没有发现

5 个答案:

答案 0 :(得分:3)

Spring @Cacheable没有任何可配置选项来为缓存设置TTL,但您可以使用@CacheEvict@Scheduled进行构建,如下所示:

@CacheEvict(allEntries = true, cacheNames = { "cache_1", "cache_2" })
@Scheduled(fixedDelay = 30000)
public void cacheEvict() {
}

您可以在此处找到详细的解决方案/解释 - Setting TTL for @Cacheable – Spring

答案 1 :(得分:3)

Spring 非常清楚TTL / TTI(Expiration)和Eviction策略,如核心 Spring Framework参考指南 here中所述。换句话说,"默认"完全依赖于 Spring Boot 应用程序通过 Spring Cache Abstraction 使用的底层数据存储(a.k.a.缓存提供程序)。

虽然 Arpit的解决方案是一个很好的解决方案,是跨不同缓存提供商(数据存储)的通用,可转移的解决方案,但它也无法涵盖更具体的到期/驱逐政策,例如到期/驱逐时要执行的操作类型,例如OVERFLOW_TO_DISK或LOCAL_DESTROY(例如,在高度可用(可能是基于分区的),分布式方案中),或无效等等。

通常,取决于UC,驱逐"所有"条目不是一个可接受的选项,也是 Spring 将此职责委托给缓存提供者的原因之一,因为此提供商在1个提供商与另一个提供商之间的差异很大。

总之......绝对要检查您的UC的要求,并将相应的缓存提供商与您的UC相匹配的功能配对。 Spring supports a wide variety of caching providersRedisApache Geode/Pivotal GemFire Hazelcast 等,每个都有不同/相似的功能。

答案 2 :(得分:3)

借助Spring Boot,我可以通过以下方式获得成功:

首先,您需要将spring-boot-starter-data-redis工件添加到POM文件中。

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-data-redis</artifactId> 
</dependency>

此后,您需要在application.properties文件中添加所需的以下配置:

#------ Redis Properties -------------
spring.cache.type=redis
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.cache.redis.time-to-live=600000

要设置的属性是spring.cache.redis.live-to-live(生存时间(以毫秒为单位。在这种情况下,设置为10分钟))。这样,@Cacheable就可以使用设置的默认TTL。

答案 3 :(得分:2)

实际上,有一种比使用@schedule更好的方法,通过扩展定义ttl的cacheManager:这是一个例子:

@Configuration
public class CacheConfig extends CachingConfigurerSupport {

@Value( "${redis.hostname}" )
private String redisHostName;

@Value( "${redis.port}" )
private int redisPort;

@Value("#{${redis.ttl}}")
private int DEFAULT_TTL;


@Bean
public JedisConnectionFactory redisConnectionFactory() {
    JedisConnectionFactory redisConnectionFactory = new JedisConnectionFactory();
    redisConnectionFactory.setHostName(redisHostName);
    redisConnectionFactory.setPort(redisPort);
    return redisConnectionFactory;
}

@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) {
    RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();
    redisTemplate.setConnectionFactory(cf);
    return redisTemplate;
}

@Bean
public CacheManager cacheManager(RedisTemplate redisTemplate) {
    RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
    cacheManager.setDefaultExpiration(DEFAULT_TTL);
    return cacheManager;
}
}

pom依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>1.4.7.RELEASE</version>
</dependency>

答案 4 :(得分:0)

默认情况下,缓存永远不会过期。如果需要设置到期时间,则必须使用以下属性键。如果该值为10000ms,则缓存将在1分钟后过期。

# Entry expiration. By default, the entries never expire.
spring.cache.redis.time-to-live=10000ms