Redis Cache (Cache Aside)
Cache no Customer Service
Fechando implementação com configuração Spring, métricas e testes.
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-redisnobuild.gradleoupom.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
- 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);
}
}
- 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);
}
}
- 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.