Redis

Quro·2024년 7월 6일
0

Web

목록 보기
5/8
post-thumbnail

Redis의 기본 개념

Redis는 Remote Dictionary Server의 약자로, 인메모리 데이터 저장소로서 데이터를 디스크가 아닌 메모리에 저장하여 빠른 읽기 및 쓰기를 제공한다. 다양한 데이터 구조를 지원하며, 주로 캐시, 세션 저장소, 메시지 브로커 등으로 사용된다.

Redis 특징

  • Key-Value 타입의 인메모리 데이터를 저장, 관리하기 위한 오픈 소스 기반의 NoSQL
    • 인메모리 (In-Memory Database)
      • 디스크가 아닌 메모리에 모든 데이터를 보유하는 DB.
      • 디스크 검색보다 자료 접근이 훨씬 빠름.
      • But, 메모리라 휘발성.
    • In-Memory 기반이라 저장 공간 제약
    • 휘발성이 특징인 메모리와 다르게 영속성 보장
  • DB, Cache, Message Queue, Shared Memory 용도로 사용됨
  • 쓰기 성능 증대를 위한 클라이언트 측 샤딩(sharding) 지원
    • 샤딩 (sharding)
      • 데이터를 조각내 분산 저장하는 데이터 처리 기법.
      • 일괄적 관리가 힘든 거대 데이터베이스나 네트워크를 작게 나눠서 저장 및 관리.
      • 샤딩을 통해 데이터를 분산 저장하면 노드의 무게를 줄여 데이터 처리 속도 향상.
  • 다양한 데이터형 지원
    • 문자열, 리스트, 해시, 셋, 정렬된 셋과 같은 다양한 데이터 구조를 지원

어떻게 레디스는 영속성을 보장하나?

AOF, RDB 방식

➜ 인메모리 데이터 저장소가 가지는 휘발성의 특성으로 데이터가 유실될 경우를 방지하여 백업 기능을 제공

AOF (Append On File) 방식
➜ Redis의 모든 write/update 연산 자체를 모두 log 파일에 기록하는 형태

RDB(Snapshotting) 방식
➜ 순간적으로 메모리에 있는 내용 전체를 디스크에 담아 영구 저장하는 방식


Spring Boot에서의 Redis 사용

인메모리 저장소로서의 Redis

Spring Boot에서 Redis는 캐시 저장소로 자주 사용된다. 캐싱은 데이터베이스의 부하를 줄이고 응답 시간을 줄이는 데 매우 유용하다.

@Repository
public class RedisRepository {

    private final RedisTemplate<String, Object> redisTemplate;

    public RedisRepository(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public void save(String key, Object value) {
        redisTemplate.opsForValue().set(key, value);
    }

    public Object find(String key) {
        return redisTemplate.opsForValue().get(key);
    }
}

위 코드에서 @Cacheable 애노테이션은 exampleCache라는 이름의 캐시에 데이터를 저장한다. 이후 같은 키로 요청이 들어오면 캐시에서 데이터를 조회하게 된다.

메시지 브로커로서의 Redis 사용

Redis는 메시지 브로커로서도 사용할 수 있다. 이는 RabbitMQ나 Kafka 같은 고도화된 메시징 시스템과는 다르지만, Redis의 인메모리 특성을 활용해 단순하고 빠른 pub/sub 기능을 제공한다

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.stereotype.Service;

@Service
public class RedisMessagePublisher {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Autowired
    private ChannelTopic topic;

    public void publish(String message) {
        redisTemplate.convertAndSend(topic.getTopic(), message);
    }
}

위 코드에서는 RedisTemplate을 이용하여 메시지를 특정 토픽에 발행(publish)하는 방법을 보여준다.

profile
개발합니다

0개의 댓글