먹수의 개발일지

[Django] Redis 캐싱으로 성능 최적화 본문

back-end/Django

[Django] Redis 캐싱으로 성능 최적화

icandle 2024. 11. 20. 18:18

Redis란? 

메모리 기반 데이터 저장소이다. 데이터를 메모리에 저장하기 때문에 매우 빠른 속도로 데이터에 접근할 수 있다.

  1. 유연한 데이터 구조: 문자열, 리스트, 해시, 셋(set), 정렬된 셋(sorted set) 등 다양한 데이터 구조를 지원
  2. 퍼시스턴스: 메모리 기반이지만 데이터를 디스크에 저장하여 장애 발생 시 데이터 복구가 가능
  3. 확장성: 클러스터링 기능을 통해 대규모 트래픽에도 대응 가능

✅ 언제 사용

In-Memory 데이터베이스의 하나로, 유실되어도 괜찮지만 빠른 데이터 조회를 할 때 사용한다. 기존 관계형 데이터베이스(MySQL, PostgreSQL)보다 훨씬 빠른 이유는 메모리 접근이 디스크 접근보다 빠르기 때문이다.

✅ 단점

1) 디스크 즉, 파일이 아닌 메모리상에 데이터를 저장함. but 프로세스 내려가면 데이터가 사라짐.

→ RDB 스냅샷으로 복구할 수 있음. 최근에는 실시간 처리는 인메모리에서, 보관은 디스크 기반 스토리지로 하는 구조가 성능과 효율을 함께 달성할 수 있다.

 

2) 싱글스레드로 lock을 제공하지 않는다.

-> 절대 쓰면 안되는 명령어 : 모든 키를 보여주는 keys나 모든 데이터를 소거하는 flushall, 콜렉션 등(100만건 넘어가면 처리시간이 10초, 1000천만건이 넘으면 100초씩 늘어남)

Django Redis 설치

pip install django-redis

 

Django settings.py에 Redis 설정 추가

# settings.py
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",  # Redis 서버 주소
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        },
        "KEY_PREFIX": "myapp"  # 키 접두사 추가
    }
}

 

Redis로 데이터 캐싱하기

from django.core.cache import cache
from django.http import JsonResponse

def seoul_market_info(request):
    # 요청 인자에 따라 캐시 키 생성
    cache_key = 'seoul_market_info_' + str(request.GET.get('parameter'))

    # 캐시에서 데이터 조회
    cached_data = cache.get(cache_key)

    if cached_data:
        return JsonResponse(cached_data)
    else:
        # 서울 상권정보 조회 로직
        data = {
            'market_name': '서울 상권',
            'info': '상권 정보 내용',
        }

        # 조회 결과를 캐시에 저장 (예: 10분 동안 유효)
        cache.set(cache_key, data, timeout=600)  # 600초 = 10분

        return JsonResponse(data)

'back-end > Django' 카테고리의 다른 글

[Locust] Django와 Locust로 API 부하 테스트  (1) 2024.11.19
Django Signals  (0) 2024.11.10
[DRF] Responsed Unauthorized 401 in AllowAny permission  (1) 2023.02.21
Comments