Estou experimentando o @Cacheable
suporte de anotação para Spring 3.1 e me perguntando se há alguma maneira de limpar os dados em cache depois de um tempo, definindo um TTL. Agora, pelo que posso ver, preciso limpar sozinho usando o@CacheEvict
, e usando isso junto com @Scheduled
posso fazer uma implementação TTL sozinho, mas parece um pouco demais para uma tarefa tão simples?
101
Aqui está um exemplo completo de configuração do Guava Cache no Spring. Usei Guava em vez de Ehcache porque é um pouco mais leve e a configuração parecia mais direta para mim.
Importar dependências Maven
Adicione essas dependências ao seu arquivo maven pom e execute clean and packages. Esses arquivos são os métodos Guava dep e Spring auxiliares para uso no CacheBuilder.
Configure o Cache
Você precisa criar um arquivo CacheConfig para configurar o cache usando a configuração Java.
Anote o método a ser armazenado em cache
Adicione a anotação @Cacheable e passe o nome do cache.
Você pode ver um exemplo mais completo aqui com capturas de tela anotadas: Guava Cache in Spring
fonte
Eu uso o hacking da vida assim
fonte
reportCacheEvict
método de qualquer lugar. Como o cacheEvict está acontecendo ??Springboot 1.3.8
e
fonte
isso pode ser feito estendendo org.springframework.cache.interceptor.CacheInterceptor e substituindo o método "doPut" - org.springframework.cache.interceptor.AbstractCacheInvoker sua lógica de substituição deve usar o método put do provedor de cache que sabe definir TTL para entrada de cache (no meu caso, uso HazelcastCacheManager)
em sua configuração de cache, você precisa adicionar esses 2 métodos de bean, criando sua instância de interceptor customizada.
Esta solução é boa quando você deseja definir o TTL no nível de entrada, e não globalmente no nível de cache
fonte
Desde Spring-boot 1.3.3, você pode definir o tempo de expiração no CacheManager usando RedisCacheManager.setExpires ou RedisCacheManager.setDefaultExpiration no bean de retorno de chamada CacheManagerCustomizer .
fonte
Ao usar o Redis, o TTL pode ser definido no arquivo de propriedades como este:
spring.cache.redis.time-to-live=1d # 1 day
spring.cache.redis.time-to-live=5m # 5 minutes
spring.cache.redis.time-to-live=10s # 10 seconds
fonte
Se você está trabalhando com redis e Java 8, pode dar uma olhada no JetCache :
@Cached(expire = 10, timeUnit = TimeUnit.MINUTES) User getUserById(long userId);
fonte