Spring @Cacheable TTL по умолчанию

Обычно я использую @Cacheable с конфигурацией кеша в своем приложении с весенней загрузкой и устанавливаю определенный TTL (время жизни) для каждого кеша.

Недавно я унаследовал приложение весенней загрузки, которое использует @Cacheable без явного указания диспетчера кеша и ttl. Я буду изменять его, чтобы быть явным.

Но я не могу узнать, каковы значения по умолчанию, когда нет ничего явного.

Я просмотрел документы но там ничего не нашел


person Anand Sunderraman    schedule 26.05.2017    source источник
comment
stackoverflow.com/questions/8181768 /   -  person dieter    schedule 26.05.2017


Ответы (5)


В Spring достаточно четко изложены политики TTL/TTI (срок действия) и выселения, как описано в основном Справочном руководстве по Spring Framework здесь. Другими словами, «значения по умолчанию» полностью зависят от базового хранилища данных (также известного как поставщик кэширования), используемого с приложением Spring Boot через Spring Cache Abstraction.

Хотя решение Arpit является хорошим обходным путем и универсальным решением, переносимым между различными поставщиками кэширования (хранилищами данных), оно также не может охватывать более конкретные политики истечения срока действия/удаления, такие как тип действия, которое необходимо выполнить, когда истечение/вытеснение, скажем, OVERFLOW_TO_DISK или только LOCAL_DESTROY (например, в высокодоступном (возможно, на основе зон), распределенном сценарии) или INVALIDATE и т. д.

Обычно, в зависимости от унифицированных коммуникаций, удаление «всех» записей не является приемлемым вариантом и является одной из причин, по которой Spring делегирует эту ответственность поставщику кэширования, поскольку эта возможность сильно различается между поставщиками.

Подводя итог... обязательно просмотрите требования к вашей унифицированной коммуникации и выберите подходящего поставщика кэширования с возможностями, соответствующими вашей унифицированной коммуникации. Spring поддерживает широкий спектр поставщиков кэширования из Redis на Apache Geode/Pivotal GemFire для Hazelcast и т. д., каждый из которых имеет разные/похожие возможности в этом отношении.

person John Blum    schedule 26.05.2017

Spring @Cacheable не имеет настраиваемого параметра для установки TTL для кеша, хотя вы можете создать его, используя @CacheEvict и @Scheduled следующим образом:

@CacheEvict(allEntries = true, cacheNames = { "cache_1", "cache_2" })
@Scheduled(fixedDelay = 30000)
public void cacheEvict() {
}

Вы можете найти подробное решение/объяснение здесь - Установка TTL для @Cacheable — Весна.

person Arpit Aggarwal    schedule 26.05.2017
comment
Мне не очень нравится этот метод. Это запланированная задача по удалению ключа; вместо того, чтобы оставлять его в кеше Redis (что в любом случае предназначено для истечения срока действия) - person Sarp Kaya; 27.07.2018
comment
Не хорошая идея. Если вы кэшируете значения из внешнего сервиса и очищаете весь кеш каждые 30 секунд, то каждые 30 секунд вы будете видеть высокую нагрузку на внешний сервис, а вы, вероятно, хотели ввести кэширование для снижения нагрузки. - person Jonathan Heinen; 03.08.2018
comment
Предоставляет очень простой способ получить максимальную отдачу от кэша Generic Spring, не выбирая конкретный (ОП не упомянул конкретный); не попадает в ловушку форсирования конкретного внедрения на OP. - person Bart Robeyns; 13.09.2020

С весенней загрузкой мне удалось добиться успеха:

Во-первых, вам нужно добавить артефакт 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.time-to-live (значение в миллисекундах. В данном случае было установлено 10 минут). При этом @Cacheable работает с установленным по умолчанию TTL.

person Anthony Anyanwu    schedule 07.07.2018
comment
Вышеприведенное действительно, но только для весенней загрузки 2.1.X согласно документам: docs.spring.io/spring-boot/docs/current/reference/html/ - person Terry Collins; 16.11.2018
comment
Это должен быть правильный ответ при использовании redis и весенней загрузки - person user666; 09.01.2019
comment
вы можете использовать PT10M в течение 10 минут - person Kalpesh Soni; 31.07.2019
comment
также эта конфигурация не будет работать, если вы начнете определять свой собственный java-компонент RedisCacheManager и все - person Kalpesh Soni; 31.07.2019

На самом деле, есть лучший способ, чем использование @schedule, путем расширения cacheManager, который определяет ttl: Вот пример:

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

пом зависимость:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>1.4.7.RELEASE</version>
</dependency>
person adamine    schedule 21.09.2017
comment
Поэтому, если вы выберете эту опцию (я так и сделал), вам нужно установить менеджер кеша в методе кэширования, я имею в виду: @Cacheable("cacheName", key = "#keyName", cacheManager = "redisCacheManager") - person Alan Teals; 15.05.2018

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

# Entry expiration. By default, the entries never expire.
spring.cache.redis.time-to-live=10000ms
person KUMARESAN KASILINGAM    schedule 01.10.2019
comment
Как 10000 мс = 1 минуте? - person L.Butz; 05.03.2020