Redis란?

이지니·2025년 10월 7일

TIL

목록 보기
4/11

Redis란?

  • Redis(Remote Dictionary Server)Remote(원격)에 위치하고 프로세스로 존재하는 In-Memory 기반의 Dictionary(Key-Value) 구조 데이터 관리 Server 시스템이다.
  • 데이터를 디스크가 아닌 메모리(RAM)에 저장하기 때문에 매우 빠른 읽기/쓰기 속도를 제공한다.
  • Java, Python, PHP, C, C++, C#, JavaScript, Node.js, Ruby, R, Go를 비롯한 정말 많은 프로그래밍 언어 프레임워크에 대한 API를 폭넓게 지원한다.
  • 흔히 캐시(Cache), 세션 저장소(Session Store), 실시간 데이터 처리 등에 사용된다.

👉 mysql같은 관계형 데이터베이스가 아닌 비 관계형 구조로서 데이터를 그저 '키-값' 형태로 단순하게 저장하기 때문에 일종의 NoSQL로 분류되기도 한다.

왜 Redis를 사용할까?

1. 속도

  • 일반적인 데이터베이스(MySQL, MariaDB 등)는 디스크 기반이라 I/O(입출력) 과정이 느리다.
  • 반면 Redis는 메모리에 데이터를 저장하므로 디스크 접근 없이 즉시 읽고 쓸 수 있다.
  • 읽기/쓰기 속도는 디스크 기반 DB보다 수십~수백 배 빠르다.

2. 데이터 구조 지원

Redis는 단순한 Key-Value 저장소가 아니다.
다양한 데이터 타입(Data Type)을 제공한다.

데이터 타입설명예시
String기본적인 문자열 값user:name = "Jieun"
List순서가 있는 문자열 리스트comments = [“hi”, “hello”]
Set중복 없는 집합tags = {“dev”, “ai”}
Hash필드-값 쌍의 구조체user:1 = {name:"Jieun", age:27}
Sorted Set점수(score)로 정렬된 집합ranking = {user1:100, user2:80}

👉 다양한 구조 덕분에 랭킹, 세션, 좋아요, 큐(Queue) 등 여러 기능을 쉽게 구현할 수 있다.


Redis 주요 특징

1. 인메모리 데이터 저장

  • 모든 데이터를 RAM(주 메모리)에 저장하므로 빠르다.
  • 하지만 서버가 꺼지면 메모리 데이터는 사라질 수 있으므로 지속성(Persistence) 옵션을 사용해야 한다.

2. 데이터 영속성(Persistence)

Redis는 RDB와 AOF 두 가지 방식으로 데이터를 디스트에 저장할 수 있다.

RDB(Redis Database Backup)

  • 일정 주기로 메모리 데이터를 스냅샷(snapshot) 형태로 저장한다.
  • 스냅샷 특성상 스냅샷이 생성되기 이전의 일부 데이터는 유실 위험이 있다.
  • 스냅샷 생성 중에 전체 레디스 서버의 성능 저하가 발생하여 클라이언트 요청 처리에 지연이 발생할 수 있다.

AOF(Append Only File)

  • 모든 write 명령을 순서대로 로그에 기록하여 복구 가능
  • 데이터 유실 없이 거의 모든 데이터에 싱크를 맞출 수 있지만 장애상황 재난복구 시 모든 로그를 다시 적용해야하기 때문에 스냅샷 방식보다 복구 속도가 느리다.

👉 일반적으로 RDB + AOF를 함께 사용해, 속도 + 안정성을 모두 확보한다.

3. 싱글 스레드 기반

  • 레디스는 단일 스레드(single-thread)로 동작한다.
  • 내부적으로 I/O 멀티플렉싱을 이용해 높은 성능을 낸다.
  • 즉, "한 번에 하나의 명령만 처리하지만 매우 빠르게 처리한다."

4. TTL(만료시간) 설정

  • 각 Key에 TTL(Time To Live)을 설정할 수 있다.
  • 예를 들어 로그인 세션을 1시간만 유지하도록 설정 가능하다.
SET session:user1 "logged_id" EX 3600

→ 1시간(3600초) 후 자동 삭제됨


Redis의 주요 활용 사례

1. 캐시(Cache)

DB에서 자주 읽는 데이터를 Redis에 저장해, DB 부하를 줄이고 응답 속도를 높인다.

SET user:1:name "User1"
GET user:1:name

💡 Twitter의 Redis 캐시 활용
Twitter는 140자 정도의 짧은 글을 올릴 수 있는 소셜 네트워킹 서비스(SNS)로
사용자가 팔로우한 계정의 최신 트윗을 보여주는 Timeline 기능을 가지고 있다.

2012년 당시 Twitter는 15만명이 넘는 실시간 활동 사용자초당 30만 건이 넘는 Timeline 요청이 발생하면서 데이터베이스 직접 접근 방식으로는 속도 저하 문제가 발생했다.

Timeline에 표시할 트윗 정보(Tweet ID, 작성자 ID)를 약 800개 정도 List 형태로 Redis에 캐싱하고, 요청이 들어오면 DB 대신 Redis에서 먼저 데이터를 조회해 Query를 단순화했다.

이 방식으로 DB 부하를 크게 줄이면서도 빠른 Timeline 조회 속도를 유지할 수 있었다.

단, 모든 사용자의 Timeline을 캐싱하면 메모리가 부족해지므로 30일 이상 미접속한 사용자의 Timeline 데이터는 Redis에서 자동 삭제되며, 재로그인 시 DB를 통해 다시 생성된다.

2. 세션 관리

로그인한 사용자의 세션 정보를 Redis에 저장하면,

  • 세션 만료 관리(TTL)
  • 다중 서버 간 세션 공유

가 간단해진다.

3. 실시간 순위/조회수/좋아요

Sorted Set을 이용하면 실시간 랭킹 시스템을 쉽게 만들 수 있다.

ZINCRBY ranking 1 "user1"
ZRANGE ranking 0 -1 WITHSCORES

4. 메시지 큐(Pub/Sub)

Redis는 Publish/Subscribe 기능을 지원한다.
여러 서비스 간 실시간 메시지 송수신이 가능하다.

PUBLISH channel1 "Hello World"
SUBSCRIBE channel1

Redis 사용 시 주의할 점

메모리 기반
RAM 용량을 초과하면 LRU 정책으로 오래된 데이터가 삭제된다.

데이터 영속화 필요
RDB/AOF 설정 없으면 서버 재시작 시 데이터 사라진다.

싱글 스레드 구조
CPU를 병렬로 활용하기 어렵지만, 대신 확실히 빠르다.

메모리 파편화
메모리 할당/해제 과정에서 빈 공간(fragment)이 누적되면 실제 물리 메모리 사용량이 커질 수 있다.
또한, RDB 스냅샷/AOF 재작성 시 Copy-On-Write로 순간적으로 최대 2배 이상 메모리를 사용할 수 있으므로 여유 메모리를 확보해야한다.


참고

https://cobinding.tistory.com/234
https://inpa.tistory.com/entry/REDIS-📚-개념-소개-사용처-캐시-세션-한눈에-쏙-정리

profile
화이팅

0개의 댓글