Cache em Ação: Como o Spring Cache Pode Transformar seu Projeto
Você já esteve na situação em que seu aplicativo web está crescendo rapidamente, atraindo um número cada vez maior de usuários? Quando você percebe que a escalabilidade está se tornando um desafio e o tráfego de dados aumenta, as operações se tornam mais complexas e o servidor começa a sofrer com a pressão crescente. A otimização de desempenho é uma prioridade constante no backlog das grandes empresas.
Aplicações web enfrentam o desafio de fornecer respostas rápidas e eficientes aos usuários, independentemente do volume de tráfego e das operações complexas ocorrendo nos bastidores. Para alcançar esse objetivo, nós, desenvolvedores, precisamos adotar estratégias inteligentes de gerenciamento de dados e recursos.
É aí que o Spring Cache entra em cena, pois o Spring Framework oferece suporte integrado para o uso de cache. Esta solução permite armazenar temporariamente resultados de operações computacionalmente caras em memória, tornando o acesso a esses dados muito mais rápido e eficiente. Isso não apenas melhora o desempenho da sua aplicação, mas também reduz a carga sobre os recursos do servidor e banco de dados, resultando em economia de tempo e recursos.
Vamos ao Exemplo Prático
Para demonstrar a eficácia do Spring Cache, realizei uma POC simples para ilustrar uma aplicação Spring Boot que calcula números de Fibonacci. Neste exemplo, usei o cache para armazenar resultados intermediários e, assim, melhorar a eficiência do cálculo.
Calculando Números de Fibonacci
Neste projeto incluí as dependências necessárias para o Spring Cache e o Caffeine como provedor de cache no arquivo build.gradle
.
Importante salientar que neste projeto para fins educativos utilizei o Caffeine. Mas você pode ajustar essa configuração de acordo com suas necessidades.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-cache'
implementation 'com.github.ben-manes.caffeine:caffeine:3.0.5'
}
Criando um serviço
FibonacciService
que calcula números de Fibonacci e usa a anotação@Cacheable
do Spring Cache para marcar o métodocalculateFibonacci
, indicando que ele deve ser cacheado.
@Service
public class FibonacciService {
@Cacheable("fibonacci")
public int calculateFibonacci(int n) {
if (n <= 1) {
return n;
} else {
return calculateFibonacci(n - 1) + calculateFibonacci(n - 2);
}
}
}
Criado também um controller
FibonacciController
para nos ajudar a ver na prática o poder do cache. Nesse exemplo simples, criei o endpoint/fibonacci
que aceita um parâmetron
para especificar o número de Fibonacci a ser calculado.
@RestController
@RequiredArgsConstructor
public class FibonacciController {
private final FibonacciService fibonacciService;
@GetMapping("/fibonacci")
public int getFibonacci(@RequestParam int n) {
return fibonacciService.calculateFibonacci(n);
}
}
Quando fazemos uma solicitação para calcular um número de Fibonacci (por exemplo,
/fibonacci?n=10
), o serviço calcula o número e o armazena em cache. Utilizamos o Postman para fazer as requisições:
Em solicitações subsequentes com o mesmo valor de n
, o serviço não recalcula o número; em vez disso, ele recupera o resultado do cache, tornando a resposta mais rápida.
Observações:
Uso Avançado de Anotações:
O Spring Cache oferece uma variedade de anotações avançadas, como
@CacheEvict
,@CachePut
e@Caching
. Estas anotações permitem um controle refinado sobre o comportamento do cache. Por exemplo,@CacheEvict
é usado para invalidar (remover) itens específicos do cache, enquanto@CachePut
permite colocar ou atualizar itens no cache.A classe CacheManager permite total controle do cache, permitindo que sua aplicação pesquise, inclua e remova objetos de acordo com suas necessidades. Quando se usa a implementação padrão do Spring Boot, ao processar as anotações, em tempo de instanciação da aplicação, é criado um Cache Manager com todos os caches que estão descritos em todas as anotações @Cacheable da aplicação.
Cache Distribuído com Spring Cache e Redis:
Além de cache local, como o Caffeine, o Spring Cache pode ser configurado para funcionar com caches distribuídos, como o Redis. Isso é valioso para aplicativos em cluster, onde várias instâncias da aplicação compartilham um cache comum. O Redis é uma escolha popular para armazenar cache distribuído devido à sua escalabilidade e desempenho.
Referencias
Genial! Dá pra fazer muita coisa com a classe CacheManager! Vou criar uma PoC, sensacional!