Время истечения времени загрузки @cacheable spring

Я реализовал кеш, и теперь я хочу добавить время истечения.

Как я могу установить время истечения при весенней загрузке с @Cacheable?

Это фрагмент кода:

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

Ответ 1

Я использую такой хакерский взлом

    @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()));
        }
    }

Ответ 2

Из справочной документации

Непосредственно через поставщика кешей. Абстракция кэша... ну, абстракция не является реализацией кэша. Решение, которое вы используете, может поддерживать различные политики данных и различные топологии, которые другие решения не выполняют (например, JDK ConcurrentHashMap) - выявление того, что в абстракции кеша было бы бесполезно просто потому, что поддержка поддержки не поддерживалась. Такая функциональность должна контролироваться непосредственно через кеш резервной копии при ее настройке или через собственный API.

Ответ 3

Обратите внимание, что в этом ответе используется ehcache, который является одним из поддерживаемых менеджеров кеша Spring Boot и, возможно, одним из самых популярных.

Сначала вам нужно добавить в 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>

Ответ 4

Вы не можете указать время истечения срока действия с помощью нотации @cacheable, поскольку @cacheable не предоставляет такой настраиваемой опции.

Однако различные поставщики кэширования, обеспечивающие кэширование spring, предоставили эту функцию через свои собственные конфигурации. Например NCache/TayzGrid позволяет вам создать разные области кэша с настраиваемым временем истечения срока действия.

Если вы внедрили свой собственный кеш, вам нужно будет определить способ определения срока действия вашего провайдера кеша, а также потребуется включить логику истечения в ваше решение.

Ответ 5

Я использую кофеин-кеширование с этой конфигурацией в течение 60 минут:

spring.cache.cache-names=forecast
spring.cache.caffeine.spec=expireAfterWrite=60m