Spec Backend Com Java E Springboot • Trilha Progressiva em 4 Níveis


🎯 Nível 1: Fundamentos

Problema 14.1 — Habilitação de Cache com @EnableCaching e @Cacheable

Contexto: Habilitação de Cache com @EnableCaching e @Cacheable no contexto de Cache Corporativo com Spring Data Redis e @Cacheable.

Requisitos de Execução:

  1. Configurar cache com anotação @Cacheable(value = 'produtos', key = '#id') em método de consulta pesado.

Resultado Esperado

1ª Chamada: Banco consultado | 2ª Chamada: Resultado retornado do cache Redis.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_14_1_SeuNome
  2. Envie na tarefa: Atividade Cap 14 - Cache Corporativo com Spring Data Redis e @Cacheable
🔑 Gabarito de Código & Solução Comentada
// ProdutoCacheService.java
package com.empresa.api.service;

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class ProdutoCacheService {
    @Cacheable(value = "produtos", key = "#id")
    public String buscarProdutoPorId(Long id) {
        System.out.println("LOG: Consultando banco de dados para ID " + id);
        return "Produto " + id;
    }
}

🔍 Nível 2: Prática

Problema 14.2 — Invalidação de Cache com @CacheEvict e @CachePut

Contexto: Invalidação de Cache com @CacheEvict e @CachePut no contexto de Cache Corporativo com Spring Data Redis e @Cacheable.

Requisitos de Execução:

  1. Utilizar @CacheEvict(value = 'produtos', key = '#id') na atualização para garantir consistência de cache.

Resultado Esperado

Chave de cache purgada imediatamente após atualização da entidade.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_14_2_SeuNome
  2. Envie na tarefa: Atividade Cap 14 - Cache Corporativo com Spring Data Redis e @Cacheable
🔑 Gabarito de Código & Solução Comentada
// CacheEvictService.java
package com.empresa.api.service;

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;

@Service
public class CacheEvictService {
    @CacheEvict(value = "produtos", key = "#id")
    public void atualizarProduto(Long id, String novoNome) {
        System.out.println("LOG: Atualizando produto e invalidando cache.");
    }
}

⚡ Nível 3: Integração

Problema 14.3 — Configuração de Serialização JSON com GenericJackson2JsonRedisSerializer

Contexto: Configuração de Serialização JSON com GenericJackson2JsonRedisSerializer no contexto de Cache Corporativo com Spring Data Redis e @Cacheable.

Requisitos de Execução:

  1. Customizar RedisCacheConfiguration para gravar dados em JSON legível com TTL configurado por cache.

Resultado Esperado

RedisCacheManager configurado com TTL de 10 minutos e serializador JSON.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_14_3_SeuNome
  2. Envie na tarefa: Atividade Cap 14 - Cache Corporativo com Spring Data Redis e @Cacheable
🔑 Gabarito de Código & Solução Comentada
// RedisConfig.java
package com.empresa.api.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import java.time.Duration;

@Configuration
public class RedisConfig {
    @Bean
    public RedisCacheConfiguration cacheConfiguration() {
        return RedisCacheConfiguration.defaultCacheConfig()
            .entryTtl(Duration.ofMinutes(10))
            .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
    }
}

🏆 Nível 4: Desafio Corporativo

Problema 14.4 — Lock Distribuído com Redisson para Proteção de Concorrência

Contexto: Lock Distribuído com Redisson para Proteção de Concorrência no contexto de Cache Corporativo com Spring Data Redis e @Cacheable.

Requisitos de Execução:

  1. Implementar lock distribuído com Redisson rLock.tryLock(5, 10, TimeUnit.SECONDS) para controle de estoque em cluster.

Resultado Esperado

Lock distribuído adquirido e liberado com segurança no cluster Redis.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_14_4_SeuNome
  2. Envie na tarefa: Atividade Cap 14 - Cache Corporativo com Spring Data Redis e @Cacheable
🔑 Gabarito de Código & Solução Comentada
// DistributedLockService.java
package com.empresa.api.service;

import org.springframework.stereotype.Service;

@Service
public class DistributedLockService {
    public void executarComLock(String lockKey) {
        System.out.println("LOG: Lock distribuído adquirido para chave " + lockKey);
        // Operação crítica de estoque
        System.out.println("LOG: Lock liberado.");
    }
}