My-Books-projects / etc

0 stars 1 forks source link

Redis #228

Open hyeonjaez opened 5 months ago

hyeonjaez commented 5 months ago

Redis

캐시


도중에 변경 될 일이 없는 데이터베이스 조회 값 자주 호출되는 데이터

스프링 부트에서의 캐시


JSR

로컬 캐시


글로벌 캐시


Redis


특징


백업


1) RDB (Redis Database) : 메모리에 있는 데이터 전체에서 스냅샷을 작성하고, 이를 디스크로 저장하는 방식

2) AOF (Append Only File) : 데이터가 변경되는 이벤트가 발생하면 이를 모두 로그에 저장하는 방식

⇒ 일부 데이터 손실에 영향을 받지 않는 경우(캐시로만 사용할 때), RDB

⇒ 장애 상황 직전까지의 모든 데이터가 보장되어야 할 경우, AOF

⇒ 강력한 내구성이 필요한 경우, RDB + AOF

⇒ 레디스는 일반적으로 AOF와 RDB를 동시에 사용하여 데이터를 백업한다.

스프링부트 redis


설정 순서

  1. maven 설정

  2. application.properties에 추가

  3. host, port 설정

  4. Redis Config 추가

  5. RedisConnectionFactory 빈으로 등록

실습


<dependency>  
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-data-redis</artifactId>  
</dependency>
@Bean  
public RedisConnectionFactory redisConnectionFactory() {  
    RedisStandaloneConfiguration redisStandaloneConfiguration  
            = new RedisStandaloneConfiguration();  
    redisStandaloneConfiguration.setHostName(redisProperties.getHost());  
    redisStandaloneConfiguration.setPort(redisProperties.getPort());  
    redisStandaloneConfiguration.setPassword(redisProperties.getPassword());  
    redisStandaloneConfiguration.setDatabase(redisProperties.getDatabase());  

    return new LettuceConnectionFactory(redisStandaloneConfiguration);  
}
@Bean  
public <T> RedisTemplate<String, T> redisTemplate() {  
    RedisTemplate<String, T> redisTemplate = new RedisTemplate<>();  

    redisTemplate.setKeySerializer(new StringRedisSerializer());  
    redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());  
    redisTemplate.setHashKeySerializer(new StringRedisSerializer());  
    redisTemplate.setConnectionFactory(redisConnectionFactory());  

    return redisTemplate;  
}

redis에 객체(dto) 를 저장할때


1. Jackson2JsonRedisSerializer

2. StringRedisSerializer

3. GenericJackson2JsonRedisSerializer

하지만!

GenericJackson2JsonRedisSerializer가 custom한 ObjectMapper를 사용할 때는 다르다?

Object mapper는 기본적으로 직렬화/ 역직렬화 시 class type 정보를 포함하지 않기 때문에 직려화된 데이터는 type 정보가 존재하지 않는다

역직렬화 시에도 objectMapper가 type 정보를 모른 채 역직렬화를 진행하게 되고 기본 타입인 LinkedHashMap 으로 역직렬화 된다.

ObjectMapper에 activeDefaultTyping() 을 통하여 class type 을 함께 직렬화/역직렬화 하도록 설정해야한다.

ObjectMapper.DefaultTyping.NON_FINAL -> 객체의 유형 정보를 추가하되 final 클래스가 아닌경우에만 유형 정보를 추가하도록 지정하는 것이다.