본문 바로가기
개발/Django

[Django] Django Cache with Redis

by Byeongdori 2022. 5. 23.
반응형

 

실제 서비스에서의 오류 원인 중 대부분은 과도한 쿼리로 인한 DB 과부하이다.

이를 해결하기 위한 방법은 두 가지가 있는데,

1. 캐싱

2. DB 쿼리 최적화

 

얼추 지금 하고 있는 프로젝트의 API 개발을 끝내고, 성능을 어떻게 개선시킬까 고민하던 차에, 

먼저 캐싱을 도입하여 성능 개선을 이루어보고자 합니다.

 

캐싱이란?

- 필요한 데이터나 값을 임시 장소(캐시)에 미리 복사해두어, 매번 원래 데이터가 있는 곳까지 접근하지 않고. 임시 장소에 빠르게 접근하여 데이터를 가져오는 방식입니다.

- API 호출 시에는 쿼리를 이용해 DB에 접근하게 되는데, 캐싱을 이용하면 쿼리를 통해 DB에 접근하는 횟수를 줄여 부하를 줄일 수 있습니다.

 

Django는 보통 Redis라는 저장소와 짝을 이루어 캐시를 많이 사용합니다.

Redis의 특징은 간단히 다음과 같습니다.

  • NoSQL
  • Key - Value 타입의 저장소 
  • 모든 데이터를 메모리에 저장하는 인메모리(In-memory) 타입의 저장소, 메모리에 저장하기 때문에 영속성 지원
  • 다양한 자료구조 지원

Django - Redis 연동하기 & 테스트 

1. Windows Redis 설치

관련 링크 -  https://hwigyeom.ntils.com/entry/Windows-%EC%97%90-Redis-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0-1

2. Django에서 사용하기 위해, django-redis 모듈 설치

pipenv install django-redis

3. settings.py에 Redis 관련 설정 추가

redis 관련 설정

  • 테스트 1 - 함수를 캐시화
    • 함수가 캐시화 되었기 때문에, 실행 후 html 파일을 수정하거나, 함수를 수정해도, settings.py 에서 설정한 CACHE_TTL이 지나야 반영됩니다.

함수를 캐시화, html 페이지가 통째로 캐시화 된다.

 

  • 테스트 2 - API로 주고받는 데이터를 캐시화
    • 먼저 cache 관련 django 라이브러리 import 후, 
    • key-value 기반의 cache 이므로, 
      • cache에 값을 저장할 때는 cache.set(key, value, 유효시간) 
      • cache에 값이 있는지 확인할 때에는 cache.get(key)
      • cache에 있는 값을 삭제할 때는 cache.delete(key)를 이용합니다.
    • 캐시에 찾는 데이터가 저장되어 있는 경우, 빠른 응답속도를 확인할 수 있습니다.
from django.core.cache import cache

cache.set(key, value, time)
cache.get(key)
cache.delete(key)

API로 주고 받는 데이터를 캐시화

실제 실무에서는, 데이터를 캐싱할 때는 유효 기간 설정이 매우 중요합니다.

변경될 일이 적은 데이터이고, 사용자들이 많이 찾는 데이터인 경우에는, 캐시 유효기간을 길게 설정한다면 긴 유효기간 동안 동일한 요청에 대한 쿼리가 DB 입장에서는 맨 처음 한 번만 실행되며, 이는 DB 서버에 오는 부하를 획기적으로 줄일 수 있습니다. 

따라서 데이터가 자주 변경되는지, 사용자들이 얼마나 자주 요청을 조회하는지에 따라 캐시를 효율적으로 활용할 방법을 찾는 것이 중요합니다.

 

반응형
SMALL

댓글