我已经实现了一个缓存,现在我想添加过期时间。
如何在Spring Boot中使用@Cacheable
设置过期时间?
下面是代码片段:
@Cacheable(value="forecast",unless="#result == null")
我已经实现了一个缓存,现在我想添加过期时间。
如何在Spring Boot中使用@Cacheable
设置过期时间?
下面是代码片段:
@Cacheable(value="forecast",unless="#result == null")
我这样使用生活技巧:
@Configuration
@EnableCaching
@EnableScheduling
public class CachingConfig {
public static final String GAMES = "GAMES";
@Bean
public CacheManager cacheManager() {
ConcurrentMapCacheManager cacheManager = new ConcurrentMapCacheManager(GAMES);
return cacheManager;
}
@CacheEvict(allEntries = true, value = {GAMES})
@Scheduled(fixedDelay = 10 * 60 * 1000 , initialDelay = 500)
public void reportCacheEvict() {
System.out.println("Flush Cache " + dateFormat.format(new Date()));
}
}
pom.xml
中:<!-- Spring Framework Caching Support -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
在src/main/resources/ehcache.xml
文件中:
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<defaultCache eternal="true" maxElementsInMemory="100" overflowToDisk="false" />
<cache name="forecast"
maxElementsInMemory="1000"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="false"
memoryStoreEvictionPolicy="LRU" />
</ehcache>
来自参考文档
直接通过您的缓存提供程序进行控制。缓存抽象是一个抽象,而不是缓存实现。您使用的解决方案可能支持各种数据策略和不同的拓扑结构,而其他解决方案则不支持(例如JDK ConcurrentHashMap)-在缓存抽象中公开这些内容将是无用的,因为没有支持。这样的功能应该直接通过后备缓存进行控制,在配置时或通过其原生API进行控制。
我使用咖啡因缓存,并配置了60分钟的过期时间:
spring.cache.cache-names=forecast
spring.cache.caffeine.spec=expireAfterWrite=60m
spring.properties
中填写hibernate.cache.region.factory_class
? - 袁文涛您可以通过使用@Scheduled
注释来实现这种驱逐策略。可使用fixedRate或cron表达式进行调度。
@Autowired
CacheManager cacheManager;
public void evictAllCaches() {
cacheManager.getCacheNames().stream()
.forEach(cacheName -> cacheManager.getCache(cacheName).clear());
}
@Scheduled(fixedRate = 6000)
public void evictAllcachesAtIntervals() {
evictAllCaches();
}
spring-boot-starter-cache
依赖,并且表现正常。你可以配置缓存对象的过期时间以及最大缓存值。application.properties
文件中添加以下行:spring.cache.caffeine.spec=expireAfterAccess=300s
spring.properties
中填写hibernate.cache.region.factory_class
? - 袁文涛LocalDateTime
对象来解决这个问题。例如:@Cacheable(value="forecast", key = "#date.toString()")
public void forecast(LocalDate date){
//
}
public void call(){
forecast(LocalDate.now());
}