我通常在我的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,但没有发现
答案 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 providers从Redis到Apache 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