728x90

들어가며,

앞서 Redis에 대한 개념과 기본 명령어를 통해 CLI 환경에서 Redis를 사용했다.

이제 본격적으로 Redis의 캐싱, 세션, pub sub 등에 대해 공부할 예정이다.

캐싱

2024.01.05 - [DB(MySQL, MongoDB, Redis, Kafka)/Redis] - Redis 기본 개념

기본 개념에서 공부했듯이 Redis는 인메모리 데이터베이스로 디스크에 저장하고 읽어 오는데 드는 비용을 줄이고 속도를 빠르게 하기 위해 사용된다. 

이때 사용되는 기능이 Cache이다. 

  1. 캐시 내부를 확인
  2. 없으면, 데이터베이스를 확인
  3. 캐시에 데이터를 저장

이 구조로 사용된다. 그러나 메모리는 휘발성이 높은 단점이 있었는데, 캐시에 저장된 데이터는 정책상 정해놓은 시간이 소요되면 자동으로 삭제된다.

초기 yml 설정

spring:
  data:
    redis:
      host: 127.0.0.1
      port: 6379
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/redis?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
    username: root
    password: 1234
  jpa:
    hibernate:
      ddl-auto: create
    show-sql: true

 

redis에 대한 설정, Mysql에 대한 설정 이렇게 두가지를 먼저 설정하는 것이 중요하다.
redis와 Mysql은 모두 docker로 컨테이너에서 띄워 사용.

 

캐시를 적용하기 위한 간단한 회원 로직 작성

 

Repository에서 Jpa연동을 설정하고 Service에서 다시 Jpa 기본 메서드인 findById를 통해 id값으로 조회하는 로직을 작성한다.
Controller는 HTTP GET 요청에 따라 동작한다.
코드는 간단한 구현이라 생략합니다.

 

Redis Config 설정

@Configuration
public class RedisConfig {

    @Bean
    RedisTemplate<String, Member> memberRedisTemplate(RedisConnectionFactory connectionFactory) {
        var objectMapper = new ObjectMapper()
                .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
                .registerModule(new JavaTimeModule())
                .disable(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS);

        var template = new RedisTemplate<String, Member>();
        template.setConnectionFactory(connectionFactory);
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new Jackson2JsonRedisSerializer<>(objectMapper, Member.class));
        return template;
    }
}

 

RedisTemplate을 사용하기 위해 config 클래스를 만들었다. 이 RedisTemplate은 문자열 키와 Member객체로 이루어진다.

RedisConnectionFactory를 통해 Redis서버와 연결을 돕는다. 여기에는 Lettuce 또는 Jedis 등이 있다. 
Key와 Value를 설정하는데, Value에 들어가는 Member 객체를 Json으로 받기 위해 Jackson2JsonRedisSerializer를 사용한다. (몇가지 오류를 방지하기 위해 objectMapper를 따로 위에서 만들어 둠)

 

public Member getMember(Long id) {
    var key = "member:" + id;

    var cacheMember = redisTemplate.opsForValue().get(key);
    if (cacheMember != null) {
        return cacheMember;
    }
    Member member = memberRepository.findById(id).orElseThrow();
    redisTemplate.opsForValue().set(key, member);
    return member;

}

 

다시 Service 계층으로 돌아와 Template을 활용해 아래의 로직을 작성하면 된다.

캐시 내부를 확인 -> 없으면, 데이터베이스를 확인 -> 캐시에 데이터를 저장

 

 

'DB(MySQL, MongoDB, Redis, Kafka) > Redis' 카테고리의 다른 글

Redis Pub/ Sub  (0) 2024.01.10
Redis 데이터 타입과 기본 명령어  (0) 2024.01.05
Redis 기본 개념  (1) 2024.01.05

+ Recent posts