Despejo de cache na inicialização do Spring

Despejo de cache na inicialização do Spring

1. Visão geral

Neste breve tutorial, vamos aprenderhow we can perform cache eviction using Spring. Estaremos criando um pequeno exemplo para demonstrar isso.

Antes de continuar, verifique nosso artigo -Guide To Caching in Spring - para se familiarizar com o funcionamento do cache do Spring.

2. Como remover um cache?

O Spring fornece duas maneiras de remover um cache, usando a anotação@CacheEvict em um método ou conectando automaticamenteCacheMangere limpando-o chamando o métodoclear().

Veja como esses dois mecanismos de despejo de cache podem ser implementados no código.

2.1. Usando@CacheEvict

Vamos criar um método vazio com a anotação@CacheEvict e fornecer o nome do cache que queremos limpar como um argumento da anotação (neste caso, queremos limpar o cache com o nome “primeiro”):

@CacheEvict(value = "first", allEntries = true)
public void evictAllCacheValues() {}

Spring will intercept all the methods annotated with @CacheEvict and clear all the values based on the allEntries flag. É possível expulsar valores com base em uma chave específica.

Para isso, tudo o que precisamos fazer é passar a chave do cache como um argumento para a anotação em vez da sinalizaçãoallEntries:

@CacheEvict(value = "first", key = "#cacheKey")
public void evictSingleCacheValue(String cacheKey) {}

Como o valor do atributokey é dinâmico, podemos usar Spring Expression Language ou um gerador de chave personalizado implementandoKeyGenerator para escolher os argumentos de interesse ou as propriedades aninhadas.

2.2. UsandoCacheManager

A seguir, vamos dar uma olhada em como podemos remover o cache usandoCacheManager fornecido pelo módulo Spring Cache. Primeiro, temos que conectar automaticamente o beanCacheManager implementado.

E então podemos limpar os caches com base em nossas necessidades:

@Autowired
CacheManager cacheManager;

public void evictSingleCacheValue(String cacheName, String cacheKey) {
    cacheManager.getCache(cacheName).evict(cacheKey);
}

public void evictAllCacheValues(String cacheName) {
    cacheManager.getCache(cacheName).clear();
}

Como podemos ver no código,the clear() method will clear all the cache entries and the evict() method will clear values based on a key.

3. Como remover todos os caches?

Spring não fornece uma funcionalidade pronta para uso para limpar todos os caches. Mas podemos fazer isso facilmente usando o métodogetCacheNames() do gerenciador de cache.

3.1. Despejo sob demanda

Vamos agora ver como podemos limpar todos os caches sob demanda. Para criar um ponto de disparo, temos que expor um ponto de extremidade primeiro:

@RestController
public class CachingController {

    @Autowired
    CachingService cachingService;

    @GetMapping("clearAllCaches")
    public void clearAllCaches() {
        cachingService.evictAllCaches();
    }
}

EmCachingService, podemos entãoclear all the caches by iterating over the cache names obtained from the cache manager:

public void evictAllCaches() {
    cacheManager.getCacheNames().stream()
      .forEach(cacheName -> cacheManager.getCache(cacheName).clear());
}

3.2. Despejo Automático

Existem certos casos de uso em que a remoção de cache deve ser realizada automaticamente em determinados intervalos. Neste caso,we can make use of the Spring’s task scheduler:

@Scheduled(fixedRate = 6000)
public void evictAllcachesAtIntervals() {
    evictAllCaches();
}

4. Conclusão

Aprendemos como despejar caches de maneiras diferentes. Uma das coisas dignas de nota sobre esses mecanismos é que ele funcionará com todas as várias implementações de cache, como eh-cache, infini-span, apache-inflamative etc.

Como sempre, todos os exemplos mencionados neste tutorial podem ser encontradosover on Github.