레디스(Redis)

최석훈·2025년 10월 20일

데이터베이스

목록 보기
14/18

Redis 란?

Redis는 Remote Dictionary Server의 약자로 빠른 오픈 소스 인 메모리 키 값 데이터 구조 스토어입니다.

키(Key) - 값(Value) 쌍의 해시 맵과 같은 구조를 가진 비관계형(NoSQL) 데이터베이스 관리 시스템(DBMS)이며, 오픈 소스 기반으로 인-메모리(In-memory) 데이터 구조 저장소로 메모리에 데이터를 저장합니다.

모든 데이터를 메모리로 불러와서 처리하는 In-Memory기반의 DBMS로 데이터베이스, 캐시, 메시지 브로커 등으로 사용되어지며, 주로 캐시 서버를 구현할 때 많이 사용됩니다.

Redis의 특징 및 장단점

레디스는 다음과 같은 다양한 자료 구조를 지원합니다.

(Strings, JSON, Sets, Lists, Sorted set ...)

  • 성능
    모든 Redis 데이터는 메모리에 저장되어 대기 시간을 낮추고 처리량을 높이며,
    평균적으로 읽기 및 쓰기의 작업 속도가 1ms로 디스크 기반 데이터베이스보다 빠릅니다.
  • 유연한 데이터 구조
    Redis의 데이터는 String, List, Set, Hash, Sorted Set, Bitmap, JSON 등 다양한 데이터 타입을 지원합니다.
    따라서, 애플리케이션의 요구 사항에 알맞은 다양한 데이터 타입을 활용할 수 있습니다.
  • 개발 용이성
    Redis는 쿼리문이 필요로 하지 않으며, 단순한 명령 구조로 데이터의 저장, 조회 등이 가능합니다.
    또한, Java, Python, C, C++, C#, JavaScript, PHP, Node.js, Ruby 등을 비롯한 다수의 언어를 지원합니다.
  • 영속성
    Redis는 영속성을 보장하기 위해 데이터를 디스크에 저장할 수 있다. 서버에 치명적인 문제가 발생하더라도 디스크에 저장된 데이터를 통해 복구가 가능합니다.
  • 싱글 스레드 방식
    Redis는 싱글 스레드 방식을 사용하여 한 번에 하나의 명령어만을 처리하기 때문에 연산을 원자적으로 처리하여 Race Condition(경쟁 상태)가 거의 발생하지 않습니다.
    하지만, 멀티 스레드를 지원하지 않기 때문에 시간 복잡도가 O(n)인 명령어의 사용은 주의해서 사용해야 합니다.

Redis 데이터 타입별 특징 및 사용법

데이터 타입설명주요 명령어사용 사례 및 특징
String단순 키-값 저장SET, GET사용자 토큰, 간단한 값 저장에 적합
List순서가 있는 값의 집합 (중복 가능)LPUSH, RPOP메시지 대기열, 작업 큐 구현에 활용
Set중복 없는 집합SADD, SMEMBERS태그, 좋아요, 관심사 집합 관리
Hash필드와 값으로 이루어진 객체 저장HSET, HGET사용자 프로필, 객체 속성 저장에 적합
Sorted Set점수 기준 정렬된 집합ZADD, ZRANGE게임 랭킹, 실시간 순위표 구현에 사용
Bitmap비트 단위 데이터 저장 및 조작SETBIT, GETBIT방문자 추적, 플래그 저장

Redis 사용 사례

캐싱

다른 데이터베이스 "앞"에 배치된 Redis는 성능이 뛰어난 인 메모리 캐시를 생성하여 액세스 지연 시간을 줄이고, 처리량을 늘리며, 관계형 또는 NoSQL 데이터베이스의 부담을 줄여줍니다.

# DB에서 불러온 사용자 데이터를 Redis에 캐싱
SET user:1001 '{"name":"이민수","age":30,"level":"gold"}' EX 300

세션 관리

Redis는 세션 관리 작업에 매우 적합합니다. Redis를 세션 키에 대한 적절한 TTL과 함께 빠른 키 값 스토어로 사용하면 간단하게 세션 정보를 관리할 수 있습니다. 세션 관리는 주로 게임, 전자 상거래 웹 사이트, 소셜 미디어 플랫폼을 비롯한 온라인 애플리케이션에 필요합니다.

# 사용자 로그인 시 세션 ID 저장
SET session:xyz12345:user_id 1001 EX 1800

실시간 순위표

Redis Sorted Set 데이터 구조를 사용하면 요소가 목록에 유지되고 점수에 따라 정렬됩니다. 이를 통해 손쉽게 동적 순위표를 생성하여 게임에서 앞서있는 사람이 누구인지 보여주거나, 좋아요를 가장 많이 받은 메시지를 게시하거나, 선두에 있는 사람이 누구인지 보여주려는 다양한 사례에 사용할 수 있습니다.

# 사용자 점수 업데이트
ZADD game:ranking 1500 player1
ZADD game:ranking 2400 player2

# 상위 3명 조회
ZREVRANGE game:ranking 0 2 WITHSCORES

속도 제한

Redis는 이벤트 속도를 측정하고 필요한 경우 제한할 수 있습니다. 클라이언트의 API 키에 연결된 Redis 카운터를 사용하여 특정 기간 동안 액세스 요청의 수를 세고 한도가 초과되는 경우 조치를 취할 수 있습니다. 속도 제한기는 포럼의 게시물 수를 제한하고, 리소스 사용량을 제한하며, 스패머의 영향을 억제하는 데 주로 사용됩니다.

# 1분 동안 사용자 요청 횟수 제한
INCR api:limit:1001
EXPIRE api:limit:1001 60

대기열

Redis List 데이터 구조를 사용하면 간단한 영구 대기열을 손쉽게 구현할 수 있습니다. Redis List는 자동 작업 및 차단 기능을 제공하므로 신뢰할 수 있는 메시지 브로커 또는 순환 목록이 필요한 다양한 애플리케이션에 적합합니다.

# 이메일 전송 요청을 큐에 저장
LPUSH email:queue '{"to":"test@example.com", "subject":"Welcome!"}'

# 작업자 프로세스에서 대기열에서 꺼내 처리
BRPOP email:queue 0

채팅 및 메시지

Redis에서는 패턴 매칭과 더불어 PUB/SUB 표준을 지원합니다. 따라서 Redis를 사용하여 고성능 채팅방, 실시간 코멘트 스트림 및 서버 상호 통신을 지원할 수 있습니다. 또한 PUB/SUB를 사용하여 게시된 이벤트를 기반으로 작업을 트리거할 수 있습니다.

# 메시지 발행
PUBLISH chat:room:101 "김지현: 안녕하세요!"

# 메시지 수신 (구독 중인 클라이언트)
SUBSCRIBE chat:room:101

실제 EX)

// npm install redis
const redis = require('redis');
const client = redis.createClient({
  host: 'localhost',
  port: 6379
});

// 캐싱 예시
async function getUser(id) {
  // 1. Redis 캐시 확인
  const cached = await client.get(`user:${id}`);
  if (cached) return JSON.parse(cached);

  // 2. 캐시 없으면 DB 조회
  const user = await db.query('SELECT * FROM users WHERE id = ?', [id]);

  // 3. Redis에 캐싱 (5분)
  await client.setEx(`user:${id}`, 300, JSON.stringify(user));
  return user;
}
profile
기술 노트 블로그 (2025.09.01~)

2개의 댓글

comment-user-thumbnail
2025년 10월 21일

Redis 개념이랑 사용 사례, 명령어 예시까지 잘 되어 있음.
JavaScript에서 실제로 어떻게 연결해서 쓰는지 코드 추가하면 더 실용적임.

// npm install redis
const redis = require('redis');
const client = redis.createClient({
  host: 'localhost',
  port: 6379
});

// 캐싱 예시
async function getUser(id) {
  // 1. Redis 캐시 확인
  const cached = await client.get(`user:${id}`);
  if (cached) return JSON.parse(cached);
  
  // 2. 캐시 없으면 DB 조회
  const user = await db.query('SELECT * FROM users WHERE id = ?', [id]);
  
  // 3. Redis에 캐싱 (5분)
  await client.setEx(`user:${id}`, 300, JSON.stringify(user));
  return user;
}

이런 식으로 실제 애플리케이션에서 어떻게 연동하는지 보여줘야
Redis를 직접 프로젝트에 적용할 수 있음.

데이터 타입별 차이도 간단히 추가하면 좋겠음.

- String: 단순 값 저장 (SET/GET)
- List: 순서 있는 목록 (LPUSH/RPOP)
- Set: 중복 없는 집합 (SADD/SMEMBERS)
- Hash: 객체 저장 (HSET/HGET)
- Sorted Set: 점수 기반 정렬 (ZADD/ZRANGE)

언제 어떤 타입 쓰는지 명확히 하는게 좋음.

1개의 답글