45

我已经实现了一个缓存,现在我想添加一个到期时间。

如何在 spring boot 中设置到期时间@Cacheable

这是一个代码片段:

@Cacheable(value="forecast",unless="#result == null")
4

8 回答 8

33

我像这样使用生活黑客

    @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()));
        }
    }
于 2016-07-08T07:55:04.187 回答
14

Note that this answer uses ehcache, which is one of supported Spring Boot cache managers, and arguably one of the most popular.

First you need to add to 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>

In 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>
于 2015-01-15T16:34:25.660 回答
12

参考文档

直接通过您的缓存提供程序。缓存抽象是……嗯,抽象不是缓存实现。您正在使用的解决方案可能支持其他解决方案不支持的各种数据策略和不同的拓扑(例如 JDK ConcurrentHashMap) - 在缓存抽象中公开它是无用的,因为没有支持支持。此类功能应在配置时直接通过后备缓存或通过其本机 API 进行控制。

于 2015-01-15T16:45:19.987 回答
6

您不能使用 @cacheable 表示法指定到期时间,因为 @cacheable 不提供任何此类可配置选项。

然而,不同的缓存供应商提供弹簧缓存已经通过他们自己的配置提供了这个特性。例如NCache / TayzGrid允许您创建具有可配置过期时间的不同缓存区域

如果您已经实现了自己的缓存,则需要定义一种在缓存提供程序中指定过期的方法,并且还需要在您的解决方案中加入过期逻辑。

于 2015-01-25T18:37:04.720 回答
6

我使用咖啡因缓存,此配置为 60 分钟过期:

spring.cache.cache-names=forecast
spring.cache.caffeine.spec=expireAfterWrite=60m
于 2018-07-12T16:34:03.797 回答
3

@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();
}
于 2020-10-19T18:47:27.917 回答
0

如果您使用的是咖啡因,则可以在application.properties文件中添加以下行:

spring.cache.caffeine.spec=expireAfterAccess=300s
于 2021-04-28T03:55:36.880 回答
0

找到这个Spring 缓存: Set expiry time to a cache entry

它使用spring-boot-starter-cache依赖项并按预期工作。您可以配置缓存对象的到期时间以及缓存值的最大数量。

于 2022-01-01T07:08:09.173 回答