Redis를 실무 흐름으로 이해하기
Redis로 캐싱, 세션 저장, Pub/Sub 메시징을 구현하세요. 핵심 데이터 타입부터 캐싱 패턴, 영속성, 언어별 클라이언트 연동까지 정리했습니다. 이 가이드는 개념을 나열하기보다, 실제 프로젝트에서 판단해야 하는 순서대로 내용을 따라갈 수 있게 구성했습니다.
Redis로 캐싱, 세션 저장, Pub/Sub 메시징을 구현하세요. 핵심 데이터 타입부터 캐싱 패턴, 영속성, 언어별 클라이언트 연동까지 정리했습니다.
Redis로 캐싱, 세션 저장, Pub/Sub 메시징을 구현하세요. 핵심 데이터 타입부터 캐싱 패턴, 영속성, 언어별 클라이언트 연동까지 정리했습니다. 이 가이드는 개념을 나열하기보다, 실제 프로젝트에서 판단해야 하는 순서대로 내용을 따라갈 수 있게 구성했습니다.
설치 명령을 외우기보다 트래픽, 런타임, 관측, 장애 대응이 어떤 순서로 이어지는지 파악합니다.
글로 읽은 내용을 머릿속에 오래 남기려면 먼저 흐름을 그림으로 잡는 편이 좋습니다. 아래 두 그림은 Redis를 학습할 때 계속 되돌아볼 수 있는 기준 지도입니다.
Redis를 처음 펼칠 때는 세부 명령보다 큰 그림이 먼저입니다. 이 섹션에서는 앞으로 배울 개념들이 어떤 문제를 풀기 위해 등장했는지부터 잡아봅니다.
# Docker (가장 간단)
docker run -d -p 6379:6379 redis:7-alpine
# macOS
brew install redis && brew services start redis
# Ubuntu/Debian
sudo apt install -y redis-server
redis-cli ping # PONG이 나오면 정상 동작여기서는 핵심 데이터 타입을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
SET session:abc123 "user-42" EX 3600 # 1시간 뒤 자동 만료
GET session:abc123
TTL session:abc123 # 남은 만료 시간(초) 확인
DEL session:abc123| 타입 | 명령어 예시 | 쓰임 |
|---|---|---|
| String | SET user:1:name "Kim" | 단순 캐시 값, 카운터(INCR) |
| Hash | HSET user:1 name Kim age 30 | 객체 하나를 필드 단위로 저장 |
| List | LPUSH queue:jobs job1 | 작업 큐, 최근 항목 목록 |
| Set | SADD tags:post:1 ai devops | 중복 없는 태그, 교집합/합집합 연산 |
| Sorted Set | ZADD leaderboard 100 user1 | 점수 기반 순위표, 랭킹 |
여기서는 캐싱 패턴을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
import redis, json
r = redis.Redis(host="localhost", port=6379, decode_responses=True)
def get_user(user_id: str) -> dict:
cache_key = f"user:{user_id}"
cached = r.get(cache_key)
if cached:
return json.loads(cached) # cache hit
user = fetch_user_from_db(user_id) # cache miss → DB 조회
r.setex(cache_key, 300, json.dumps(user)) # 5분 TTL로 캐시에 저장
return user
def update_user(user_id: str, data: dict):
save_user_to_db(user_id, data)
r.delete(f"user:{user_id}") # 갱신 시 캐시 무효화(invalidation)여기서는 Pub/Sub 메시징을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
# 발행(publisher)
r.publish("notifications", "새 주문이 도착했습니다")
# 구독(subscriber)
pubsub = r.pubsub()
pubsub.subscribe("notifications")
for message in pubsub.listen():
if message["type"] == "message":
print("수신:", message["data"])영속성(RDB/AOF)은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 방식 | 동작 | 특징 |
|---|---|---|
| RDB (스냅샷) | 주기적으로 메모리 전체를 디스크에 저장 | 재시작이 빠르지만, 마지막 스냅샷 이후 데이터는 유실될 수 있음 |
| AOF (Append Only File) | 모든 쓰기 명령을 로그처럼 순차 기록 | 데이터 유실 위험이 적지만 파일이 커지고 재시작이 느림 |
여기서는 클라이언트 연동을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
pip install redis # Python
npm install ioredis # Node.jsimport Redis from "ioredis";
const redis = new Redis({ host: "localhost", port: 6379 });
await redis.set("key", "value", "EX", 60);
const value = await redis.get("key");