Redis Cache (Cache Aside)

Cache no Customer Service

Fechando implementação com configuração Spring, métricas e testes.

Avançado 40 min 35 pontos Leitura 0%

Nesta aula você vai

  • Finalizar integração Redis no customer-service
  • Expor métricas operacionais da camada de cache
  • Cobrir comportamento com testes de integração

Cache no Customer Service

Objetivos

  • Consolidar solução de cache-aside pronta para produção.
  • Medir impacto via métricas de latência e hit-rate.
  • Validar com teste automatizado.

Pré-requisitos

  • Aulas 1 e 2 da matéria concluídas.
  • spring-boot-starter-data-redis no build.gradle ou pom.xml.
  • Actuator e Prometheus configurados.

Conceito

Implementação de cache só está completa quando inclui configuração, código, métricas e testes. Aqui você fecha o ciclo no customer-service.

Estrutura de arquivos

services/customer-service/src/main/java/br/com/sistemasamo/customer/
├── config/RedisConfig.java
├── cache/CustomerCacheRepository.java
├── service/CustomerService.java
└── web/CustomerController.java
services/customer-service/src/test/java/br/com/sistemasamo/customer/
└── CustomerServiceCacheIT.java

Passo a passo

  1. Configuração Redis (RedisConfig.java):
@Configuration
public class RedisConfig {
  @Bean
  public LettuceConnectionFactory redisConnectionFactory(
      @Value("${spring.data.redis.host}") String host,
      @Value("${spring.data.redis.port}") int port) {
    return new LettuceConnectionFactory(host, port);
  }

  @Bean
  public StringRedisTemplate stringRedisTemplate(LettuceConnectionFactory factory) {
    return new StringRedisTemplate(factory);
  }
}
  1. Endpoint e serviço já usando cache:
@RestController
@RequestMapping("/customers")
public class CustomerController {
  private final CustomerService customerService;

  @GetMapping("/{id}")
  public CustomerResponse getById(@PathVariable String id) {
    return customerService.getCustomerById(id);
  }
}
  1. Teste de integração (CustomerServiceCacheIT.java):
@SpringBootTest
@AutoConfigureMockMvc
class CustomerServiceCacheIT {
  @Autowired MockMvc mvc;

  @Test
  void shouldServeSecondReadFromCache() throws Exception {
    mvc.perform(get("/customers/c-1")).andExpect(status().isOk());
    mvc.perform(get("/customers/c-1")).andExpect(status().isOk());

    mvc.perform(get("/actuator/prometheus"))
      .andExpect(status().isOk())
      .andExpect(content().string(containsString("customer_cache_hit_total")));
  }
}

Como testar

docker compose up -d customer-service redis postgres
./gradlew :services:customer-service:test
curl -s http://localhost:8081/actuator/prometheus | rg "customer_cache_(hit|miss)_total"

Teste manual do endpoint:

curl -s http://localhost:8081/customers/c-1 | jq
curl -s http://localhost:8081/customers/c-1 | jq

Dicas de projeto

  • Mantenha timeout baixo no cliente Redis.
  • Cache não deve alterar contrato da API.
  • Crie alertas para queda brusca de hit-rate.

Erros comuns

  • Não ter teste para fallback quando Redis indisponível.
  • Falhar serialização JSON e não registrar log.
  • Achar que cache elimina necessidade de índices no banco.

Resumo

Você finalizou uma implementação completa de cache-aside no customer-service, com configuração Spring, métricas e cobertura de teste.