∟ Framework/∟ DRF

Redis를 Django 캐시 백엔드로 설정하기

최 수빈 2025. 3. 31. 09:26

 

Redis(Remote Dictionary Server)

외부에 존재하는 key-value 저장소

빠른 응답 속도를 바탕으로 캐싱, 세션 관리 등에 활용

 

  • In-memory 데이터베이스: 메모리에 데이터를 저장하여 디스크보다 약 1,000배 빠름
  • 다양한 데이터 타입 지원

Redis Key-Value

  • 복잡한 쿼리 불필요
  • 데이터를 잊어버릴 수 있음 → cache 만료시간(TTL) 등으로 관리 가능
  • 단일 작업 처리 → 오히려 성능 안정성과 예측 가능성 향상

→ 데이터를 빠르게 읽고 쓰는 데 최적화된 도구

 

 

Redis의 활용

 

카운터(Counter)로 사용

조회수, 방문자 수 등의 실시간 카운팅에 적합 

DB 대신 Redis에 먼저 기록하고, 주기적으로 DB에 반영

 

자주 변경되는 데이터

예: 좋아요, 팔로우

실시간 랭킹, 인기 게시물 계산 등에도 유용

→ 초당 16만건 이상 처리 가능

 

세션 및 실시간 검색

로그인 유저 관리, 실시간 검색어 트래킹

중요도는 낮지만 자주 바뀌는 데이터 처리에 적합

 

서버 확장 시 데이터 공유

여러 서버에서 동일한 캐시 접근 필요 시 Redis가 효과적

 

 

Redis 기본 흐름

 

DB에서 필요한 데이터를 미리 Caching (선택)

 

요청이 들어오면 Caching 되어 있는지 확인 (cache-key 이용)

 

→ Caching 되어 있다면 바로 조회해서 처리 (Cache Hit)

  1. DB에서 데이터를 조회
  2. Caching
  3. 요청 처리

→ 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초 후 만료되는 데이터 캐싱

cache miss 197 ms
cache hit 95ms

 

 

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 서버
성능 매우 빠름 공유 가능, 동기화 쉬움
확장성 낮음 서버 확장에 유리

 

 

caches

 

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