Я реализовал кеш, и теперь я хочу добавить время истечения.
Как я могу установить время истечения при весенней загрузке с @Cacheable
?
Это фрагмент кода:
@Cacheable(value="forecast",unless="#result == null")
Я реализовал кеш, и теперь я хочу добавить время истечения.
Как я могу установить время истечения при весенней загрузке с @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()));
}
}
Из справочной документации
Непосредственно через поставщика кешей. Абстракция кэша... ну, абстракция не является реализацией кэша. Решение, которое вы используете, может поддерживать различные политики данных и различные топологии, которые другие решения не выполняют (например, JDK ConcurrentHashMap) - выявление того, что в абстракции кеша было бы бесполезно просто потому, что поддержка поддержки не поддерживалась. Такая функциональность должна контролироваться непосредственно через кеш резервной копии при ее настройке или через собственный API.
Обратите внимание, что в этом ответе используется 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>
Вы не можете указать время истечения срока действия с помощью нотации @cacheable, поскольку @cacheable не предоставляет такой настраиваемой опции.
Однако различные поставщики кэширования, обеспечивающие кэширование spring, предоставили эту функцию через свои собственные конфигурации. Например NCache/TayzGrid позволяет вам создать разные области кэша с настраиваемым временем истечения срока действия.
Если вы внедрили свой собственный кеш, вам нужно будет определить способ определения срока действия вашего провайдера кеша, а также потребуется включить логику истечения в ваше решение.
Я использую кофеин-кеширование с этой конфигурацией в течение 60 минут:
spring.cache.cache-names=forecast
spring.cache.caffeine.spec=expireAfterWrite=60m