Skip to content

Django-redis #

Find similar titles

2회 업데이트 됨.

Edit
  • 최초 작성자
  • 최근 업데이트

Structured data

Category
Programming

Django’s cache framework #

출처:https://docs.djangoproject.com/en/4.2/topics/cache/

동적 웹 사이트는 사용자가 페이지를 요청할 때마다 데이터베이스 쿼리부터 템플릿 렌더링, 비즈니스 로직에 이르기까지 모든 종류의 계산을 수행하여 사이트 방문자가 보는 페이지를 만듭니다. 처리 오버헤드 관점에서 보면 파일 시스템 서버를 읽는 일반적인 방식보다 훨씬 비용이 많이 듭니다.

대부분의 웹 애플리케이션에 있어서 이 오버헤드는 큰 문제가 되지 않습니다. 대부분의 웹 애플리케이션은 washingtonpost.com 이나 slashdot.org 이 아니라 트래픽이 매우 많은 중소규모 사이트입니다. 그러나 트래픽이 많은 중간에서 높은 사이트의 경우 오버헤드를 가능한 한 많이 줄이는 것이 필수적입니다.

이때 캐싱이 등장합니다.

캐시(Cache) #

캐시는 나중에 요청하러 올 결과를 미리 저장해두었다가 빠르게 서비스해주는 것을 의미합니다. 즉, 미리 결과를 저장하고 나중에 요청이 오면 해당 요청에 대해서 DB 또는 API를 참조하지 않고 Cache에 접근하여 요청을 처리하게 됩니다. 이러한 방식으로 모든 결과를 캐싱할 필요는 없으며, 서비스할 때 많이 사용되는 부분을 캐싱한다면 전체적으로 영향을 주어 효율을 극대화할 수 있습니다.

캐싱 #

캐싱이란 사용이 잦은 데이터의 경우 매번 기억장치 간 이동으로 인한 시간 손실을 피하고자 CPU 내부의 크기는 작지만 접근 속도가 압도적으로 빠른 캐시 메모리에 저장해 놓고 사용하는 방식을 말합니다.

장고는 동적 페이지를 저장할 수 있는 강력한 캐시 시스템을 제공하므로 각 요청에 대해 계산할 필요가 없습니다. 장고는 편의상 다양한 수준의 캐시 세분화를 제공합니다. 특정 뷰의 출력을 캐시 할 수 있고, 생성하기 어려운 부분만 캐시 할 수 있으며, 전체 사이트를 캐시 할 수도 있습니다. 기본적으로는 Memcached를 사용할 수 있지만, 이번에는 Redis로 사용해보겠습니다.

Django-Redis #

Redis란? #

Remote Dictionary Server Redis의 풀네임에서 알 수 있듯이 dictionary 구조 한마디로 key-value 형태로 데이터를 저장하고 관리하는 서버를 말합니다. 일반적으로 우리가 데이터베이스에서 데이터를 가져온다는 것은 하드디스크에서 가져온다는 뜻인데, 하드디스크는 속도로 따지면 최하위권입니다. 그래서 가져올 데이터의 용량이 크다면 그만큼 로딩에 시간이 걸리게 되고, 이는 웹서비스에서 마이너스 요소가 됩니다. 그래서 자주 변경되지 않는 데이터는 캐시 메모리에 넣어놓고 쓰면 용량이 큰 데이터도 매우 빠른 속도로 로딩할 수 있습니다.

사용처 #

인메모리의 장단점을 고려했을 때 가장 적합한 역할을 캐시 데이터베이스 서버로 사용하는 것입니다. 휘발성이 강한 Redis의 특성을 고려하여 유실되어도 무방한 데이터들을 저장하여 사용하도록 합니다. 간단하게 게시글을 조회할 때 조회 수를 캐시에 저장했다가 5분이 지나면 데이터베이스에 저장되도록 하는 코드를 작성해보겠습니다.

사용법 #

Redis-server #

Django-redis를 사용하기 전에 서버를 먼저 설치하고 실행해야 합니다.

  • Mac 기준으로 진행합니다.

  • brew 패키지 관리자를 통해서 간단하게 설치할 수 있습니다

    brew install redis
    
  • redis-server 명령어를 통해 서버를 실행한 후

Image

  1. 명령어를 통해 정상적으로 설치되었는지 확인합니다.

    > redis-cli ping
    PONG
    
  2. Redis 설치가 완료되면 Django 와 Redis 사이에 위치해 줄 미들웨어가 있어야 합니다. pip을 통해서 django-redis를 설치해줍니다.

    pip / pip3 install django-redis
    
  3. 문제없이 설치가 완료되면 Django 프로젝트의 settings.py 에 옵션을 추가해줘야 합니다.

    CACHES = {  
        "default": {
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "redis://127.0.0.1:6379", # 1번 DB
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
            }
        }
    }
    
  4. settings.py 파일에 옵션을 반영했다면, 해당 기능을 사용할 API들이 작성된 views 파일에 데이터를 Redis에 저장하거나, 불러오는 코드를 추가해주면 됩니다.

        def increase_views(self):
            cache_key = f'course_{self.object.id}_views'
    
            # Redis에 조회수를 저장
            current_views = cache.get(cache_key, self.object.views)
            cache.set(cache_key, current_views + 1)
    
        def update_last_update(self):
            last_update_key = f'last_update_{self.object.id}_time'
            last_update_time = cache.get(last_update_key)
    
            if not last_update_time or (timezone.now() - last_update_time).seconds > 300:
                cache_key = f'course_{self.object.id}_views'
                self.object.views = cache.get(cache_key)
                self.object.save()
    
                # Redis에 마지막 업데이트 시간 저장
                cache.set(last_update_key, timezone.now())
    
  5. redis-cli로 접속하여, key * 명령어를 통해 현재 저장된 key 값들을 조회하면 :1:course_49_views 라는 key 값에 마지막 조회수인 424 라는 value와 :1:last_update_49_time 라는 key 값에 조회수가 저장된 시간이 value로 잘 저장된 것을 확인할 수 있습니다.

Image

주의사항 #

데이터 변경 #

캐시에 저장된 데이터는 데이터베이스에 변경 사항이 생겨도 적용되지 않습니다. 그러므로 일정 시간이 지나면 지워지게 하거나 데이터베이스의 데이터가 변경될 때 캐싱 데이터에도 최신화가 이루어질 수 있도록 해야 합니다.

데이터 타입 #

캐시에 모든 데이터 타입이 들어갈 수 있는 것은 아닙니다. Django-redis 예제를 보면 항상 딕셔너리 또는 리스트 형식으로만 저장되는 것을 확인할 수 있습니다. 따라서 원하는 데이터를 저장하고 싶다면 딕셔너리/리스트 등으로 해당 데이터를 감싼 뒤 저장해야 합니다.

0.0.1_20240214_1_v81