spring

[redis] 레디스 설치 및 스프링 부트 환경 설정 그리고 캐시 등록과 삭제_2

seulhasony 2023. 8. 14. 11:23

1. 애플리케이션 자바 파일에 @EnableCaching 어노테이션을 통해 캐시를 사용할 수 있도록 해주세요.

@SpringBootApplication
@EnableCaching
public class redisTestApplication {
	public static void main(String[] args) {
		SpringApplication.run(redisTestApplication.class, args);
	}
}

 

2. 캐시를 위한 config 파일을 생성해서 관련 코드를 작성해주세요.

@Configuration //config bean으로 활용하기 위함
@RequiredArgsConstructor
public class CacheConfig {
    
    private String host = "localhost";
    
    private int port = 6379;

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory){
        RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig()
                //key와 value 직렬화하는 과정 : 데이터 -> 바이트로 변환
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));

        return RedisCacheManager.RedisCacheManagerBuilder
                .fromConnectionFactory(redisConnectionFactory)
                .cacheDefaults(configuration)
                .build();
    }
    
    @Bean
    public RedisConnectionFactory redisConnectionFactory(){
        // 레디스 서버를 싱글인스턴스 서버로 할 것이기 때문에,
        // RedisStandaloneConfiguration를 사용
        
        RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
        configuration.setHostName(host);
        configuration.setPort(port);

        return new LettuceConnectionFactory(configuration);
    }
}

 

 

3. 캐시를 저장할 서비스 클래스 아래의 메소드에 @Cacheable 어노테이션을 지정해주세요.

 @Cacheable("bestProduct")
    public Product getBestProductByBrandName(String brandName){
    
    }

캐시를 설정할 때 고려해야 하는 것이 있다. -> 자주 변하지 않는 데이터인가?

==> 자주 변하고 삭제되는 데이터라면 캐시로 활용하기엔 부적합하다.

 

위와 같은 코드는 bestProduct라는 캐시의 이름의 아래 메소드의 인자값으로 넘어온 

brandName을 key의 값으로 캐시가 생성됩니다.

 


 

<캐시가 적용되고 흐름>

1. 캐시에 저장된 값이 있는지 확인한다.

2-1. 없다면, 브랜드 이름으로 들어온 인자값이 best 상품을 찾아오는 getBestProductByBrandName 메소드가 실행되어 캐시가 저장된다.

2-1. 있다면, 캐시에서 best 상품의 값을 바로 가져온다. 

 


캐시를 삭제하는 @CacheEvict

 

1. 모든 캐시를 삭제

@CacheEvict(value = "bestProduct", allEntries = true)

 

2. 입력한 캐시의 이름을 가진 캐시를 삭제

@CacheEvict(value = "bestProduct")

 

3. 인자값으로 넘어온 값의 해당되는 키의 캐시를 삭제

@CacheEvict(value = "bestProduct", key = "#brandName")
private String getBestProductByBrandName(String brandName)