![]()
Redis는 Remote Dictionary Server의 약자로 빠른 오픈 소스 인 메모리 키 값 데이터 구조 스토어입니다.
키(Key) - 값(Value) 쌍의 해시 맵과 같은 구조를 가진 비관계형(NoSQL) 데이터베이스 관리 시스템(DBMS)이며, 오픈 소스 기반으로 인-메모리(In-memory) 데이터 구조 저장소로 메모리에 데이터를 저장합니다.
모든 데이터를 메모리로 불러와서 처리하는 In-Memory기반의 DBMS로 데이터베이스, 캐시, 메시지 브로커 등으로 사용되어지며, 주로 캐시 서버를 구현할 때 많이 사용됩니다.
레디스는 다음과 같은 다양한 자료 구조를 지원합니다.
(Strings, JSON, Sets, Lists, Sorted set ...)
![]()
| 데이터 타입 | 설명 | 주요 명령어 | 사용 사례 및 특징 |
|---|---|---|---|
| String | 단순 키-값 저장 | SET, GET | 사용자 토큰, 간단한 값 저장에 적합 |
| List | 순서가 있는 값의 집합 (중복 가능) | LPUSH, RPOP | 메시지 대기열, 작업 큐 구현에 활용 |
| Set | 중복 없는 집합 | SADD, SMEMBERS | 태그, 좋아요, 관심사 집합 관리 |
| Hash | 필드와 값으로 이루어진 객체 저장 | HSET, HGET | 사용자 프로필, 객체 속성 저장에 적합 |
| Sorted Set | 점수 기준 정렬된 집합 | ZADD, ZRANGE | 게임 랭킹, 실시간 순위표 구현에 사용 |
| Bitmap | 비트 단위 데이터 저장 및 조작 | SETBIT, GETBIT | 방문자 추적, 플래그 저장 |
캐싱
다른 데이터베이스 "앞"에 배치된 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
// 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 개념이랑 사용 사례, 명령어 예시까지 잘 되어 있음.
JavaScript에서 실제로 어떻게 연결해서 쓰는지 코드 추가하면 더 실용적임.
이런 식으로 실제 애플리케이션에서 어떻게 연동하는지 보여줘야
Redis를 직접 프로젝트에 적용할 수 있음.
데이터 타입별 차이도 간단히 추가하면 좋겠음.
언제 어떤 타입 쓰는지 명확히 하는게 좋음.