Redis(Remote Dictionary Server)
외부에 존재하는 key-value 저장소
빠른 응답 속도를 바탕으로 캐싱, 세션 관리 등에 활용
- In-memory 데이터베이스: 메모리에 데이터를 저장하여 디스크보다 약 1,000배 빠름
- 다양한 데이터 타입 지원
- 복잡한 쿼리 불필요
- 데이터를 잊어버릴 수 있음 → cache 만료시간(TTL) 등으로 관리 가능
- 단일 작업 처리 → 오히려 성능 안정성과 예측 가능성 향상
→ 데이터를 빠르게 읽고 쓰는 데 최적화된 도구
Redis의 활용
카운터(Counter)로 사용
조회수, 방문자 수 등의 실시간 카운팅에 적합
DB 대신 Redis에 먼저 기록하고, 주기적으로 DB에 반영
자주 변경되는 데이터
예: 좋아요, 팔로우
실시간 랭킹, 인기 게시물 계산 등에도 유용
→ 초당 16만건 이상 처리 가능
세션 및 실시간 검색
로그인 유저 관리, 실시간 검색어 트래킹
중요도는 낮지만 자주 바뀌는 데이터 처리에 적합
서버 확장 시 데이터 공유
여러 서버에서 동일한 캐시 접근 필요 시 Redis가 효과적
Redis 기본 흐름
DB에서 필요한 데이터를 미리 Caching (선택)
요청이 들어오면 Caching 되어 있는지 확인 (cache-key 이용)
→ Caching 되어 있다면 바로 조회해서 처리 (Cache Hit)
- DB에서 데이터를 조회
- Caching
- 요청 처리
→ Caching 되어 있지 않다면 (Cache Miss)
Caching이 의미가 없어지는 데이터는 Redis가 오히려 효율이 떨어짐
결과값이 계속 갱신되는 데이터 → 캐시도 계속 변경 필요
캐시에 저장할 데이터 특성 고려 필요
캐싱(Caching)
DB 부하를 줄이고 빠른 응답 제공
자주 조회되는 데이터를 Redis에 미리 저장해두고 사용
모든 데이터를 캐시에 저장하면 메모리 비용이 큼 → 캐시 적합성 판단 필수
캐싱 전략 이해
캐시 읽기 전략 (Read Cache Strategy)
Look Aside (Cache Aside) 패턴
요청 → 캐시 확인 → 없으면 DB 조회 후 캐시에 저장
기본 캐시 전략
캐시 장애 시에도 서비스 유지 가능 (요청이 한 번에 DB로 몰리면 서비스 장애 가능성 있음)
최초에 캐시로 데이터를 넣어주는 작업(Cache Warming) 필요
Read Through 패턴
캐시가 DB 조회까지 담당
캐시가 필수 경로
→ 장애 발생 시 서비스 중단 위험
캐시 쓰기 전략 (Write Cache Strategy)
Write Back (Write Behind) 패턴
먼저 캐시에 저장 후 일정 주기로 DB에 반영
성능 좋지만 캐시 장애 시 데이터 유실 가능성
Write Through 패턴
캐시와 DB 동시에 저장 (두번의 저장이 이루어짐)
캐시를 이용하여 DB 동기화
→ 항상 최신 상태 유지, 유실 방지
Write Around 패턴
DB에 직접 저장
캐시 미스가 발생했을 때만 캐시에 반영 (cache가 만료될 때까지 유지됨)
일관성 이슈 존재 → cache 만료시간(TTL) 활용 권장
일반적으로 Look Aside + Write Around 조합을 많이 사용
Redis 설치 및 사용
배포 환경에서는 Redis만 설치되어있는 컴퓨터를 따로 사용 (Redis Server)
brew install redis
redis-server
redis-cli
# 테스트
ping
# PONG
Redis 기본 명령어
Create
set key value # key value 저장
setex key seconds value # seconds초 뒤에 삭제되는 key value를 저장
Read
get key # Key에 해당하는 value 조회
keys * # 모든 key 조회
keys * 명령어는 redis가 가지고 있는 모든 key를 조회하는 큰 부하가 들어가는 명령어
redis는 한 번에 하나의 일을 처리하기에 keys * 명령어는 조심해야 함 (특히 프로덕션 환경에서는 사용해서는 안됨)
Update
rename old_key new_key # key 이름 변경
expire key seconds # 해당 key의 데이터 만료시간을 seconds초로 설정
Delete
del key # key 삭제
Django에서 Redis 사용
Django는 기본적으로 caching기능 내장 (시스템의 메모리를 이용해서 캐시를 저장)
기본 API
python manage.py seed products --number=10000
# products/urls.py
from django.urls import path
from . import views
urlpatterns = [
path("", views.product_list),
]
# products/serializers.py
from rest_framework import serializers
from .models import Product
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = "__all__"
# products/views.py
from django.shortcuts import render
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import Product
from .serializers import ProductSerializer
# Create your views here.
@api_view(["GET"])
def product_list(request):
products = Product.objects.all()
serializer = ProductSerializer(products, many=True)
return Response(serializer.data)
캐시 적용
from django.core.cache import cache
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import Product
from .serializers import ProductSerializer
# Create your views here.
@api_view(["GET"])
def product_list(request):
cache_key = "product_list"
if not cache.get(cache_key):
print("cache miss")
products = Product.objects.all()
serializer = ProductSerializer(products, many=True)
json_data = serializer.data
cache.set(cache_key, json_data, 10)
response_data = cache.get(cache_key)
return Response(serializer.data)
10초 후 만료되는 데이터 캐싱
Redis를 Django 캐시 백엔드로 설정하기
설정
pip install django-redis
# settings.py
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> keys *
1) ":1:product_list" # KEY_PREFIX없음:version=1:product_list
Local Cache vs. Global Cache
Local Cache | Global Cache | |
저장 위치 | 각 서버의 메모리 | 별도의 Redis 서버 |
성능 | 매우 빠름 | 공유 가능, 동기화 쉬움 |
확장성 | 낮음 | 서버 확장에 유리 |
Settings | Django documentation
The web framework for perfectionists with deadlines.
docs.djangoproject.com
'∟ Framework > ∟ DRF' 카테고리의 다른 글
Django + 외부 API (1) | 2025.04.01 |
---|---|
API 문서화(Documentation) (0) | 2025.03.31 |
ORM 최적화 (0) | 2025.03.31 |
Django ORM(Object Relational Mapping) 활용 (0) | 2025.03.31 |
Token Auth with JWT (0) | 2025.03.30 |