이제는 알아야 한다 r..e..d..i..s..

최미래·2024년 8월 1일
13
post-thumbnail

Redis란?

Key, Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터 베이스 관리 시스템이다.

비정형 데이터를 저장, 관리하기 위한 오픈 소스 기반의 NoSQL
DB, Cache, Message Queue, Shared Memory 용도로 사용되며
인메모리 데이터 구조를 가진 저장소이다.

*인메모리 (In-Memory) 구조란?
컴퓨터의 주기억장치인 RAM에 데이터를 올려서 사용하는 방법이다.

  • RAM에 데이터를 저장하게 되면 메모리 내부에서 처리가 되므로
    데이터를 저장/조회할 때 하드디스크를 오고가는 과정을 거치지 않아도 되어 속도가 빠르다.
  • 그러나 서버의 메모리 용량을 초과하는 데이터를 처리할 경우, RAM의 특성인 휘발성에 따라 데이터 유실의 가능성이 있다.

image

기존 DB가 있는데도 Redis를 사용하는 이유

  • DB는 데이터를 디스크에 직접 저장하기 때문에 서버에 문제가 발생하여
    다운되더라도 데이터가 손실되지 않는다.

    그러나 매번 디스크에 접근해야하기 때문에 사용자가 많아질 수록
    부하가 많아져서 느려질 수 있기에 캐시 서버를 도입해 사용한다.
    이 캐시 서버로 이용할 수 있는 것이 바로 Redis이다.
  • 같은 요청이 여러번 들어올 때 Redis를 사용함으로써 매번 DB를 거치지 않고
    캐시 서버에서 저장해놨던 값을 가져와 DB의 부하 줄이고
    서비스의 속도도 느려지지 않게 한다.

Redis의 특징

  1. Key, Value 구조
    → 쿼리를 사용할 필요가 없다.

  2. 빠른 처리 속도
    → 디스크가 아닌 메모리에서 데이터를 처리하기 때문에 속도가 빠르다

  3. Data Type(Collection)을 지원
    → 개발의 편의성, 생산성이 좋아지고 난이도가 낮아진다.

  4. AOF, RDB 방식
    → 인메모리 데이터 저장소가 가지는 휘발성의 특성으로
    데이터가 유실될 경우를 방지하여 백업 기능을 제공한다.

  5. Redis Sentinel 및 Redis Cluster를 통한 자동 파티셔닝 제공
    → Master와 Slaves로 구성하여 여러대의 복제본을 만들 수 있고,
    여러대의 서버로 읽기를 확장할 수 있다.

  6. String, Lists, Sets, Sorted Sets, Hashes 자료 구조 지원

  7. 싱글 스레드
    → 한번에 하나의 명령만 수행이 가능하므로 Race Condition이 발생하지 않는다.
    중간에 처리 시간이 긴 명령어가 들어오면 그 뒤에 명령어들은 모두 앞에 있는 명령어가 처리될 때까지 대기해야 한다.

Redis 사용 시 주의할 점

  • 서버 장애 시 운영 플랜
    인메모리 데이터 저장소의 특성상, 서버에 장애 발생 시 데이터 유실될 수 있다.

  • 시간 복잡도
    Single Threaded 사용으로 한번에 하나의 명령만 수행이 가능하다.
    → 처리 시간이 긴 요청의 경우 장애가 발생할 수 있다.

  • 메모리 단편화
    크고 작은 데이터를 할당하고 해제하는 과정에서
    메모리의 파편화가 발생하여 응답 속도가 느려질 수 있다.

  • 주기적인 모니터링
    메모리 사용량이 너무 많으면 Redis 서버의 성능 저하/장애로 이어질 가능성
    → 주기적인 모니터링을 통한 메모리 관리가 필요하다.

실습을 통해 더 가까워지기

1. spring boot 의존성 추가

implementation 'org.springframework.boot:spring-boot-starter-data-redis'

2. application.yml 파일 설정

spring:
  datasource:
    url:
    username:
    password:
    driver-class-name:
  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        format_sql: true
  cache:
    type: redis
  redis:
    host: 127.0.0.1
    port: 6379

cache 타입을 redis로 지정하고 포트를 redis 기본 포트인 6379로 설정

3. Redis Config 파일 생성

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

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

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(host, port);
    }

    @Bean
    public CacheManager cacheManager() {
        RedisCacheManager.RedisCacheManagerBuilder builder =
                RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(redisConnectionFactory());

        RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig()
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())) // Value Serializer 변경
				.disableCachingNullValues()
                .entryTtl(Duration.ofMinutes(30L));

        builder.cacheDefaults(configuration);

        return builder.build();
    }
}
  • @EnableCaching
    : Spring 프레임워크의 캐싱 기능 활성화
  • redisConnectionFactory()
    : Redis와의 연결을 관리하는 RedisConnectionFactory 설정
  • cacheManager(): Redis 캐시 매니저 설정
    • .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()))
      : 캐시된 값을 JSON 형식으로 직렬화
    • .disableCachingNullValues() : 캐시 값이 null인 경우 캐싱하지 않도록
    • .entryTtl(Duration.ofMinutes(30L)) : 캐시 항목의 유효 기간 설정

4. 그 외 간단한 서비스 로직 구현

5. 결과 확인 - Redis 명령어

  • Redis 실행

    redis-server
  • Redis CLI 실행

    redis-cli
  • Redis Cache에 저장된 데이터 조회

    keys *
    get Member::1

Redis 관련 어노테이션

  • @Cacheable 데이터 조회
    캐시에 데이터가 있으면 메서드 로직을 실행 x 캐시로부터 데이터 조회 후 반환.
    캐시에 데이터가 없다면 메서드 내부의 로직을 실행 o 캐시에 데이터 저장 후 반환.

  • @CachePut 데이터 수정
    무조건 메서드 내부의 로직을 실행하고 캐시에 데이터를 저장한 후 반환.

  • @CacheEvict 데이터 삭제

Redis 캐싱 실습 Github 링크

profile
주니어 백엔드 엔지니어, 최미래입니다.

3개의 댓글

comment-user-thumbnail
2024년 8월 1일

6379> ping
pong
😀

1개의 답글
comment-user-thumbnail
2024년 8월 6일

😃

답글 달기

관련 채용 정보