[CS] Redis

박원준·2025년 6월 13일

⚡️ CS 면접 대비: Redis 정리

Redis는 대용량 데이터를 빠르게 처리할 수 있는 인메모리 데이터 저장소로,
성능과 실시간성이 중요한 시스템에서 자주 사용됩니다.


✅ Redis란?

Redis는 고속 데이터 처리를 위해 사용되는 인메모리 데이터 저장소입니다.
일반적인 관계형 데이터베이스(RDBMS)와는 다르게, 데이터를 디스크가 아닌 메모리에 저장하기 때문에
읽기/쓰기 속도가 매우 빠릅니다.


📌 주요 특징

  • 메모리에 데이터를 저장하여 속도가 매우 빠름
  • 디스크 접근이 없으므로 응답 지연 최소화
  • 자주 조회되는 데이터를 Redis에 저장해 애플리케이션의 응답속도 향상
  • 영속성 지원: 메모리 기반이지만 데이터를 디스크에 저장 가능 (Snapshot, AOF)
  • 다양한 자료구조 지원: String, List, Set, Sorted Set, Hash, Stream
  • Pub/Sub 메시징 시스템 내장
  • 단일 스레드 기반 구조로 간단하지만 빠른 처리가 가능함

🔍 Redis vs RDBMS

항목RedisRDBMS
저장 방식메모리 기반 (선택적으로 디스크)디스크 기반
속도매우 빠름상대적으로 느림
데이터 구조Key-Value 기반 자료구조테이블 기반
트랜잭션단순한 MULTI/EXEC 제공복잡한 트랜잭션 처리 가능
주요 용도캐시, 세션 저장, 실시간 처리정형화된 데이터 저장, 트랜잭션
영속성RDB, AOF 지원 (선택적)기본적으로 디스크에 영속 저장

🧾 Redis의 영속성 방식

🔹 RDB (Snapshotting)

  • 주기적으로 메모리 상태를 디스크에 저장 (백업 이미지)
  • 성능에 큰 영향을 주지 않지만, 중간에 장애 발생 시 데이터 유실 가능성 있음

🔹 AOF (Append Only File)

  • 모든 write 작업을 로그로 기록
  • 데이터 유실 거의 없음, 복구 용이
  • 로그가 길어지면 리라이팅 필요 (압축 가능)

🆚 RDB vs AOF

항목RDBAOF
저장 방식일정 주기로 메모리 상태 저장모든 write 명령을 로그로 저장
속도빠름느림 (상대적으로)
복구성일부 데이터 유실 가능데이터 손실 최소화 가능
파일 크기작음

🔄 Redis 복제와 고가용성 구성

  • Master-Slave 복제: 읽기 부하 분산 가능
  • Sentinel: 마스터 장애 감지 및 자동 Failover
  • Redis Cluster: 데이터 샤딩을 통한 수평 확장 가능 (scale-out)

실시간 서비스에서는 Redis Sentinel이나 Redis Cluster 구성을 통해 장애 대응 및 분산 저장을 구현합니다.


💡 Redis 활용 예시

  • 자주 사용하는 데이터를 Redis에 캐시 → DB 부하 감소 및 응답 속도 개선
  • 세션 저장소로 활용 (로그인 인증 정보)
  • 게임 서버 랭킹 시스템 (Sorted Set)
  • 소셜 피드 정렬 및 실시간 댓글 처리
  • 실시간 채팅 시스템
  • Pub/Sub 모델을 통한 간단한 메시지 브로커 역할

⚠️ Redis의 제한점

  • 메모리 기반이므로 서버 RAM 용량이 데이터 저장 한계
  • 보안 기본 제공 미흡 (네트워크 격리 및 TLS 설정 필요)
  • 단일 스레드 기반이라 CPU 병렬 처리 어려움
  • 대규모 TTL 설정이나 대용량 Key 삭제 시 잠깐 멈춤 현상 (blocking) 발생 가능

💻 실습: Spring Boot에서 Redis 사용 예시

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        return template;
    }
}
@Service
public class CacheService {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

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

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

🚀 Redis는 단순한 캐시를 넘어, 다양한 실시간 서비스의 핵심 구성 요소입니다.
단순 암기보다 언제, 왜 Redis를 쓰는지에 대한 이해를 중심으로 정리하세요!

0개의 댓글