Redis & Django

Junseo Jung·2024년 4월 18일
0
post-thumbnail

Redis?

REmote DIctionary Server로 캐시나 빠른 응답속도를 가진 데이터베이스로 사용되는 오픈소스 In-memroy NoSQL key-value 저장소이다. 디스크가 아닌 메모리에 데이터를 저장하기 때문에 빠른 속도를 가지며 안정성을 가진다.

Redis 설치 및 확인

  • mac
    brew install redis
  • Ubuntu
    curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
    
    echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
    
    sudo apt-get update
    sudo apt-get install redis
    Install Redis on Linux
  • Using Docker
    docker pull redis:버전
    docker run -p 6379:6379 --name redis redis:버전
  • 설치 확인
    $ redis-cli ping
    PONG

Redis with Django

Django는 Django cache framework를 통해 캐싱기능을 제공한다.

  • Memcached : Redis와 비슷하게 In-memory 데이터베이스이다.
  • Redis
  • Database caching : DB에 캐싱을 위한 테이블을 만들고 캐싱을 사용한다.
  • Filesystem caching : 특정 파일을 만들고 파일시스템을 통해 캐싱을 사용
  • Local-memory caching : 말 그대로 로컬 메모리를 사용해 캐싱한다. 배포 환경에 적절하지 않을 수 있다.
  • Dummy caching : 실제로 캐싱하지 않고 캐싱하는 척 한다.

Redis v.s Memcached

: Memcached는 단순성을 위해 설계된 반면 Redis는 광범위한 사용에 효과적인 풍부한 기능 제공

  • Redis ⇒ 다양한 데이터 타입 제공(해싱을 통한 객체 저장 등)

Django에서의 Redis를 통한 캐시 사용

  • settings.py
    CACHES = {
        "default": {
            "BACKEND": "django.core.cache.backends.redis.RedisCache",
            "LOCATION": "redis://127.0.0.1:6379",
        }
    }
    • settings.py에서 설정하는 것만으로도 Redis를 통한 캐싱이 사용 가능하다.

      호스트 주소를 변경하여 간단하게 다른 위치의 Redis 또한 사용 가능하다.
      ex1) redis로 설정하여 다른 docker container에 있는 redis 사용
      ex2) xxx.xxx.x.x로 설정하여 다른 서버의 Redis 사용

  • redis_key_schema.py
    import datetime
    
    def date_key(date) -> str:
        if isinstance(date, datetime.datetime):
            return date.strftime("%Y-%m-%d")
        elif isinstance(date, datetime.date):
            return date.strftime("%Y-%m-%d")
        elif isinstance(date, str):
            return date
        else:
            raise ValueError("Invalid date type")
    • Redis는 key-value로 동작하며 key의 관리를 편하게 하기 위해 키 생성 코드를 작성한다.
    • 하드코딩의 경우와 달리 한번에 관리할 수 있다.
from django.core.cache import cache
from ..redis_key_schema import date_key

def get(self, request):
    serializer = InputSerializer(data=request.query_params)

    if serializer.is_valid():
        date = serializer.validated_data.get("date", datetime.today().date())
        
        # 캐시에서 조회
        data = cache.get(date_key(date))

        if data is None:
            building_to_minute_power(date)
            minute_power_refresh()
            data = get_hour_power(group_list, schedule_list)
				
						# 캐싱
            cache.set(date_key(date), data)

				res = ...
    else:
        return res_fail(
            "Invalid query parameters.", status=status.HTTP_400_BAD_REQUEST
        )
    return res_ok(data=res, status=status.HTTP_200_OK)

: django.core.cache를 통해 간단하게 캐싱을 사용할 수 있다.


참고.

Django’s cache framework | Django documentation

Redis vs. Memcached | AWS

Django 성능 최적화: 캐싱 - (2)

0개의 댓글

관련 채용 정보