🔥 들어가며 — "DB가 느려서 화면이 안 뜬다고요?"
쇼핑몰 이벤트 페이지를 클릭했는데 로딩 스피너가 3초, 5초 넘게 돌고 있다면 — 개발자 입장에서는 가슴이 내려앉는 순간입니다. 이 지연의 가장 흔한 주범은 데이터베이스(DB)입니다. 요청이 올 때마다 수백만 건 데이터를 디스크에서 긁어 오니 어쩔 수 없이 느립니다.
이럴 때 가장 자주 등장하는 해결사가 바로 Redis입니다. "자주 요청되지만 거의 안 바뀌는 데이터는 빠른 곳에 미리 꺼내놓자" — 이게 캐시(Cache)이고, Redis는 이 역할을 아주 잘합니다. 캐시 외에도 로그인 세션 저장, 실시간 알림 큐, 랭킹 처리 등 현대 웹 서비스 곳곳에 Redis가 쓰이고 있습니다.
한 줄 정의를 드리면: Redis는 메모리(RAM) 위에서 데이터를 저장하고 읽는 초고속 데이터 저장소입니다. 디스크 대신 메모리를 쓰기 때문에 일반 DB보다 수십~수백 배 빠릅니다.
오늘은 딱 세 가지만 합니다. 설치 → 실행 → 첫 명령(PING·SET·GET). 어떤 OS(Windows·macOS·Linux)를 쓰든 커버합니다. 가장 쉽고 실패 가능성이 낮은 방법은 Docker이며, 이유는 아래에서 설명합니다. 기준 버전은 Redis Open Source 8.6.1(2026년 2월 출시 최신 안정 버전)입니다.
긴장 풀고, 명령어 한 줄씩 따라와 보세요.
🧠 핵심 개념 — Redis를 이해하는 3가지 포인트
1. Redis는 "데이터 구조 서버(Data Structure Server)"다
Redis를 그냥 "빠른 DB"라고만 생각하면 나중에 헷갈립니다. 공식 소개는 "data structure server"입니다. 단순히 데이터를 저장하는 게 아니라, 다양한 자료구조 형태로 메모리 위에서 데이터를 다룬다는 의미입니다.
비유를 들면 이렇습니다:
| 비유 | 설명 |
|---|---|
| 📊 일반 DB (MySQL 등) | 거대한 엑셀 스프레드시트 — 행과 열로 정리된 창고 |
| 📋 Redis | 화이트보드에 붙인 포스트잇 묶음 — 텍스트, 목록, 집합, 순위표 등 다양한 형태 |
그리고 이 화이트보드는 책상 서랍(디스크) 이 아니라 손 바로 닿는 책상 위(메모리) 에 있어서, 꺼내는 속도가 압도적으로 빠릅니다. Redis가 지원하는 자료구조는 Strings, Hashes, Lists, Sets, Sorted Sets, Streams 등 다양하며, 이 시리즈에서 하나씩 배웁니다.
2. Redis는 "앱과 DB 사이"에 놓인다
Redis가 실제 서비스에서 어떤 위치에 있는지 흐름을 보면 이해가 훨씬 빠릅니다.
(메모리, 초고속 < 1ms)
캐시 HIT → 즉시 반환 ✅
(캐시 MISS)
DB 조회 → Redis 저장 후 반환
⚡ 메모리
🐢 디스크
이 패턴을 Cache-Aside(또는 Look-Aside Cache)라고 부릅니다. 앱이 직접 캐시를 관리하는 가장 기본적인 방식이에요. 이 시리즈 3편에서 Python·Node.js 코드로 직접 구현하게 됩니다.
3. redis-cli가 뭔가요?
redis-cli는 Redis 서버에 명령을 직접 날리는 터미널 도구입니다. MySQL의 mysql 명령어처럼, Redis 서버가 잘 동작하는지 확인하고 데이터를 직접 조회·수정할 때 씁니다. 이 시리즈 12편 내내 가장 자주 등장할 도구이니 꼭 친해져 두세요!
⚙️ Lab 0 — 설치와 첫 연결
PING → PONG, SET/GET을 눈으로 확인한다.🐳 방법 1: Docker (모든 OS 공통 — 가장 권장)
Docker를 왜 권장하냐고요? 내 컴퓨터 환경을 건드리지 않고, 명령어 두 줄로 Redis를 켜고 끌 수 있기 때문입니다. 실습이 끝나면 컨테이너를 삭제하면 흔적도 없어요. Docker Desktop이 설치되어 있다는 전제로 진행합니다.
아래 명령어를 터미널(Mac/Linux) 또는 PowerShell(Windows)에 붙여넣으세요.
# Redis 8.6.1 컨테이너를 백그라운드(-d)로 실행
# -p 6379:6379 : 내 컴퓨터의 6379 포트를 컨테이너와 연결
docker run -d --name redis -p 6379:6379 redis:8.6.1
# 실행 중인 redis 컨테이너 안으로 들어가서 redis-cli 실행
docker exec -it redis redis-cli
# 연결 확인: PONG이 나오면 성공!
127.0.0.1:6379> PING
PONG
# 데이터 저장: "hello" 키에 "world" 저장
127.0.0.1:6379> SET hello "world"
OK
# 데이터 조회: "hello" 키의 값을 꺼내기
127.0.0.1:6379> GET hello
"world"
# 현재 저장된 키 목록 조회 (실제 운영에선 쓰지 말 것!)
127.0.0.1:6379> KEYS *
1) "hello"
🖥️ OS별 설치 방법 (Docker 없이 직접 설치하고 싶다면)
🐧 Linux (Ubuntu/Debian)
TERMINALsudo apt-get install lsb-release curl gpg
curl -fsSL https://packages.redis.io/gpg \
| sudo gpg --dearmor \
-o /usr/share/keyrings/redis-archive-keyring.gpg
sudo chmod 644 \
/usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/\
redis-archive-keyring.gpg] \
https://packages.redis.io/deb \
$(lsb_release -cs) main" \
| sudo tee /etc/apt/sources.list.d/redis.list
sudo apt-get update
sudo apt-get install redis
redis-cli
PING
🍎 macOS (Homebrew)
TERMINAL# Homebrew 탭 추가
brew tap redis/redis
# Redis 설치
brew install --cask redis
# Redis 서버 실행
redis-server \
$(brew --prefix)/etc/redis.conf
# 새 터미널 탭에서 접속
redis-cli
PING
🪟 Windows (WSL2)
TERMINAL# PowerShell (관리자)에서 실행
wsl --install
# 재부팅 후 WSL 터미널에서
# 위의 Linux APT 절차를 그대로 수행
# 또는 Docker Desktop 설치 후
# 방법 1(Docker)을 사용 (더 간단)
🚨 설치 후 PONG이 안 나온다면? — 흔한 실패 원인 5가지
다른 Redis 프로세스나 앱이 이미 6379 포트를 점유 중입니다.
→
lsof -i :6379 (Mac/Linux) 또는 netstat -ano | findstr 6379 (Windows)로 확인Docker Desktop이 켜져 있는지 확인하세요. 트레이 아이콘에 고래🐳가 보여야 합니다.
"redis"라는 이름의 컨테이너가 이미 있으면 오류 납니다.
→
docker rm -f redis로 기존 컨테이너 삭제 후 재시도Redis 설치가 완료되지 않은 경우입니다. 설치 단계를 처음부터 다시 진행하세요.
윈도우 방화벽이나 보안 소프트웨어가 6379 포트를 막고 있을 수 있습니다.
→ Docker 방법 사용 시 Docker Desktop 네트워크 설정을 확인하세요.
🐍 Python으로 Redis 연결하기 (redis-py)
redis-cli로 동작을 확인했다면, 이제 코드로 연결해봅시다. Python에서는 redis-py 라이브러리를 사용합니다.
pip install redis
import redis
# Redis 서버에 연결 (기본 포트 6379)
# decode_responses=True : 바이트가 아닌 문자열로 받기
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
# ① 연결 확인: True가 출력되면 성공
print(r.ping()) # 출력: True
# ② 데이터 저장: SET hello "world"와 동일
r.set('hello', 'world')
# ③ 데이터 조회: GET hello와 동일
value = r.get('hello')
print(value) # 출력: world
# ④ TTL(만료 시간) 설정: 10초 후 자동 삭제
r.set('session:user1', 'logged_in', ex=10)
print(r.ttl('session:user1')) # 출력: 10 (초 단위 남은 시간)
# 파일 저장 후 실행
python redis_hello.py
# 기대 출력:
# True
# world
# 10
decode_responses=True를 꼭 넣어주세요. 이 옵션이 없으면 데이터가 b'world'처럼 바이트 형태로 반환되어 일반 문자열 비교 시 문제가 생깁니다.🟢 Node.js로 Redis 연결하기 (node-redis)
Node.js에서는 node-redis 라이브러리를 사용합니다. ES Module(import 문법) 기준으로 작성합니다.
npm install redis
import { createClient } from 'redis';
// Redis 서버에 연결 (기본 포트 6379)
const client = createClient({ url: 'redis://localhost:6379' });
// 에러 핸들러 등록 (필수!)
client.on('error', (err) => console.error('Redis 연결 오류:', err));
// 비동기로 연결
await client.connect();
// ① 연결 확인: PONG이 출력되면 성공
console.log(await client.ping()); // 출력: PONG
// ② 데이터 저장
await client.set('hello', 'world');
// ③ 데이터 조회
const value = await client.get('hello');
console.log(value); // 출력: world
// ④ TTL 설정: 10초 후 자동 삭제
await client.set('session:user1', 'logged_in', { EX: 10 });
console.log(await client.ttl('session:user1')); // 출력: 10
// 작업 완료 후 연결 종료
await client.disconnect();
# .mjs 확장자 또는 package.json에 "type":"module" 설정 필요
node redis_hello.mjs
# 기대 출력:
# PONG
# world
# 10
💼 실무 팁 — 초심자가 꼭 알아야 할 3가지
✅ 팁 1: Redis 기본 포트 6379는 절대 외부에 열지 마세요
Redis는 기본적으로 인증 없이 누구나 접속 가능합니다. 클라우드 서버에서 6379 포트를 방화벽으로 막지 않으면, 외부에서 데이터를 통째로 읽거나 삭제할 수 있습니다. 로컬 실습 때는 괜찮지만, 서버에 올릴 때는 반드시 bind 127.0.0.1 설정 + 방화벽 차단을 해주세요. (12편에서 자세히 다룹니다)
✅ 팁 2: KEYS * 명령어는 운영 서버에서 절대 쓰지 마세요
학습용으로는 KEYS *가 편리하지만, 운영 서버에서는 Redis를 순간적으로 멈추게 만들 수 있습니다. 저장된 키가 수백만 개라면 전체를 스캔하느라 서버가 응답 불능 상태가 됩니다. 운영 환경에서는 SCAN 명령어를 사용하세요.
✅ 팁 3: Redis는 "캐시 전용"이 아닙니다
많은 분들이 Redis = 캐시라고만 알고 있는데, 실제로는 세션 저장소, 메시지 큐, 실시간 랭킹, 분산 락, pub/sub 메시징 등 다양하게 활용됩니다. 또한 RDB·AOF 설정으로 데이터를 디스크에도 저장할 수 있어서, "껐다 켜면 다 날아간다"는 것도 오해입니다.
📋 오늘의 핵심 요약 5줄
- Redis는 메모리 기반 초고속 데이터 구조 서버로, 캐시·세션·큐 등에 폭넓게 쓰인다.
- 일반 DB와 달리 디스크가 아닌 RAM에 데이터를 저장하므로 응답 속도가 압도적으로 빠르다.
- 설치는 Docker가 가장 쉽고 안전하며, Linux·macOS·Windows(WSL2) 직접 설치도 가능하다.
redis-cli로PING → PONG,SET/GET을 확인하면 연결 성공이다.- Python은 redis-py, Node.js는 node-redis 라이브러리로 코드에서 바로 연결할 수 있다.
☑️ 오늘의 체크리스트
- Redis 8.6.1이 내 환경(Docker 또는 OS 직접)에서 실행되고 있다
- redis-cli에서
PING→PONG을 확인했다 SET hello "world"/GET hello가 정상 동작했다- Python 또는 Node.js 코드에서
r.ping()/client.ping()이 성공했다 - Redis가 단순 캐시가 아닌 "Data Structure Server"임을 이해했다
- 운영 서버에서
KEYS *를 쓰면 안 되는 이유를 알았다
🧩 확인 퀴즈 (직접 풀어보세요!)
- Redis가 일반 DB보다 빠른 근본적인 이유는 무엇인가요?
SET name "철수" EX 60명령을 실행하면 60초 후에 어떻게 될까요?- Python에서
redis.Redis(..., decode_responses=True)의decode_responses=True를 빼면 어떤 문제가 생기나요?
▶ 정답 확인 (클릭)
- 데이터를 디스크가 아닌 메모리(RAM)에 저장하기 때문입니다. 메모리 접근 속도는 디스크보다 수십~수백 배 빠릅니다.
- 해당 키(
name)가 자동으로 삭제됩니다.GET name을 하면nil이 반환됩니다. - 데이터가
'world'대신b'world'처럼 바이트 형태로 반환됩니다. 일반 문자열 비교 시 의도치 않은 버그가 생길 수 있습니다.
1. redis-cli에서
SET name "당신의이름" EX 30 실행 후, 30초가 지난 뒤 GET name을 해보세요.2. Python 코드에서
r.set('counter', 0) 후 r.incr('counter')를 3번 호출하면 최종값이 얼마인지 확인해보세요.3. Docker를 쓴다면
docker stop redis로 컨테이너를 멈추고, docker start redis로 다시 켜봅니다. 아까 저장한 데이터가 남아있나요? 없나요? (힌트: 기본 설정에서는 사라집니다. 이유는 9편에서!)✅ #1 Redis 시작하기: 설치·실행·첫 명령(PING) ← 현재 글
⬜ #2 키·TTL·만료: 캐시의 핵심 규칙
⬜ #3 Strings: 카운터·간단 캐시 만들기
⬜ #4 Hashes: 세션·프로필 저장소 만들기
⬜ #5 Lists·Sets: 큐와 중복 방지
⬜ #6 Sorted Sets: 랭킹/리더보드
⬜ #7 Pub/Sub vs Streams: 실시간 메시징
⬜ #8 동시성 제어: 트랜잭션(MULTI/EXEC)·WATCH
⬜ #9 퍼시스턴스: RDB·AOF·복구 체크
⬜ #10 복제·고가용성: Replication·Sentinel
⬜ #11 클러스터: 샤딩·해시 슬롯·제약
⬜ #12 보안·성능·관측: ACL·eviction·latency
📌 Redis 입문 시리즈 #1 | 난이도: ⭐☆☆☆☆ 입문 | 기준 버전: Redis Open Source 8.6.1
'개발 > REDIS' 카테고리의 다른 글
| #6🏆 Sorted Sets: 랭킹/리더보드 (1) | 2026.03.19 |
|---|---|
| #5 📬 Lists·Sets: 큐와 중복 방지 (0) | 2026.03.19 |
| #4 List와 Queue 활용하기: 비동기 작업 큐 만들기 (0) | 2026.03.17 |
| #3 Strings: 카운터·간단 캐시 만들기 (0) | 2026.03.17 |
| #2 키·TTL·만료: 캐시의 핵심 규칙 (0) | 2026.03.17 |