SpringBoot

DB 통신 속도 증가 Cacheable CacheEvict redis 활용

pepega 2021. 12. 21. 15:45

무작정 Cache를 사용하게 되면 오히려 성능 저하가 올 수 있다.

 

따라서 자신이 가지고 있는 비즈니스로직에 정말 필요하다면 활용하길 바란다.

 

@Cacheable, redis, @CacheEvict, redisConfig(lettuce)

 

IDE : Intellij

DB : Redis

 

글에서는 토큰 관리를 위해Redis, Cacheable, CacheEvict를 활용하였다.

 

하루 한 번 토큰을 갱신하는데계속 DB에 접근하기에는 성능이 저하가 우려되어 Cache 용도로 Redis를 활용하게 되었다.

 

흐름은 아래와 같다.

RedisConfig 설정

@Configuration
@EnableCaching
public class RedisConfig {
  @Value("${spring.redis.host}")
  private String redisHost;

  @Value("${spring.redis.port}")
  private int redisPort;

  @Value("${spring.redis.timeout}")
  private int redisTimeout;
    
  @Bean
  public LettuceConnectionFactory lettuceConnectionFactory() {
    LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
      .commandTimeout(Duration.ofMillis(redisTimeout))
      .build();

    RedisStandaloneConfiguration serverConfig = new RedisStandaloneConfiguration(redisHost, redisPort);
    LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(serverConfig, clientConfig);
    lettuceConnectionFactory.setValidateConnection(true);

    return new LettuceConnectionFactory(serverConfig, clientConfig);
  }

  @Bean
  public RedisTemplate<byte[], byte[]> redisTemplate() {
    RedisTemplate<byte[], byte[]> redisTemplate = new RedisTemplate<>();
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.setValueSerializer(new StringRedisSerializer());
    redisTemplate.setConnectionFactory(lettuceConnectionFactory());
    return redisTemplate;
  }
}

다음 내용에 포함되어있지만

Timeout 시간을 추가했다.

기존에는 1분 Timeout이 있으나 .yml 파일에 3000ms로 바꾸었다.

 

 

public interface SampleTokenRepository extends JpaRepository<SampleToken, String>, SampleTokenRepositoryCustom {

  @Cacheable(value = "sampleToken")
  Token findByTokenId(String tokenId);
    
  @CacheEvict(value = "sampleToken", allEntries = true)
  public void evictToken() {}
}

Jpa를 호출하여 DB에 있는 내용을 @Cacheable을 활용하여 Redis로 옮긴다.

 

 

이후 서비스 로직에서

해당 토큰을 삭제해야 하는 일이 있는 경우

@CacheEvict 메서드를 호출하여

 

Redis의 Value를 삭제 할 수 있다.

 

출처

https://www.baeldung.com/spring-webflux-cacheable

https://www.baeldung.com/spring-boot-evict-cache