Django 캐시 캐시 사용 상세 정보

7792 단어 Django캐시Cache
캐시 (Cache) 는 고성능 사이트를 만들고 사용자 체험을 향상시키는 데 매우 중요하지만, 많은 코드를 사용할 수 있는 우리처럼 가장 중요한 것은 캐시를 어떻게 사용하는지 배우는 것이다.오늘은 캐시 캐시 응용 장면과 작업 원리를 살펴보고, Django에서 캐시를 설정하고 사용하는 방법을 상세히 소개합니다.
캐시 캐시
캐시는 데이터를 더 빨리 읽을 수 있는 매체를 통칭하며, 데이터 읽기를 가속화할 수 있는 다른 저장 방식을 가리킨다.일반적으로 임시 데이터를 저장하는데 자주 사용하는 미디어는 읽는 속도가 빠른 메모리이다.일반적으로 데이터베이스에서 필요한 데이터를 여러 번 추출하는 것은 메모리나 하드디스크 등 한 번에 읽는 것보다 비용이 많이 든다.중대형 사이트의 경우 캐시를 사용하여 데이터베이스에 대한 접근 횟수를 줄이는 것이 사이트의 성능을 향상시키는 관건 중의 하나이다.
캐시 캐시를 사용하는 이유
Django에서 사용자가 보기에 도달할 것을 요청하면 보기는 데이터베이스에서 데이터를 추출하여 템플릿에 동적 렌더링을 합니다. 렌더링된 결과는 사용자가 본 웹 페이지입니다.만약 사용자가 매번 요청할 때마다 데이터베이스에서 데이터를 추출하고 렌더링하면 서버의 압력이 높을 뿐만 아니라 클라이언트도 즉시 응답을 얻지 못할 것이다.렌더링된 결과를 더 빠른 캐시에 넣을 수 있다면, 요청이 있을 때마다 캐시에 대응하는 자원이 있는지 확인하고, 있다면, 캐시에서 직접 응답을 꺼내서 데이터를 가져오고 렌더링하는 시간을 절약하면 시스템 성능은 물론 사용자 체험도 크게 향상시킬 수 있다. 
우리는 실제 블로그의 예를 하나 보았다.우리가 첫 페이지에 접근할 때마다 아래 보기는 데이터베이스에서 글 목록을 추출하고 과장된 템플릿으로 보냅니다.대부분의 경우, 우리의 블로그는 그렇게 자주 업데이트되지 않기 때문에, 글 목록은 변하지 않는다.이렇게 하면 사용자가 일정 시간 내에 첫 페이지를 여러 번 방문할 때 데이터베이스에서 같은 데이터를 다시 읽는 것은 매우 큰 낭비이다.

from django.shortcuts import render
 
def index(request):
  #  
  article_list = Article.objects.all()
  return render(request, 'index.html', {'article_list': article_list})
캐시 캐시를 사용하면 이 문제를 해결할 수 있습니다.사용자가 처음으로 블로그 첫 페이지를 방문할 때, 우리는 데이터베이스에서 글 목록을 추출하여 캐시에 저장합니다. (항상 사용하는 것은 메모리입니다. 이것은 당신의 설정에 달려 있습니다.)사용자가 단위 시간 내에 첫 페이지에 다시 접근할 때, Django는 캐시가 만료되었는지 확인하고, 캐시에 있는 글 목록 자원이 존재하는지, 존재하는지 확인하고, 캐시에서 데이터를 직접 읽고 템플릿을 렌더링합니다.

from django.shortcuts import render
from django.views.decorators.cache import cache_page
 
 
@cache_page(60 * 15) #  ,  15  
def index(request):
  article_list = Article.objects.all()
  return render(request, 'index.html', {'article_list': article_list})
참고: Django에서 캐시를 사용하기 전에 필요한 설정을 먼저 해야 합니다.
캐시 캐시의 응용 장면
캐시는 주로 페이지의 실시간성에 대한 요구가 높지 않은 페이지에 적용된다.캐시에 저장된 데이터는 일반적으로 빈번하게 접근하고 자주 수정되지 않는 데이터이다.우리는 몇 가지 응용 예를 들자.
.블로그 글.사용자가 하루에 한 문장을 업데이트한다고 가정하면 블로그에 1일 캐시를 설정할 수 있고 하루 후에 새로 고칠 수 있다.쇼핑몰.상품의 설명 정보는 거의 변하지 않고 상품의 구매 수량은 사용자의 상황에 따라 실시간으로 갱신해야 한다.우리는 캐시 상품 설명 정보만 선택할 수 있다..
  • 웹 페이지를 캐시합니다.웹 내비게이션 메뉴 및 바닥글 캐시..
  • Django 캐시 설정
    Django에서 여러 캐시 방식을 사용할 수 있습니다. 캐시를 사용하려면 settings에서 먼저 해야 합니다.py에서 설정하고 적용합니다.캐시 미디어에 따라 캐시 백엔드를 설정해야 합니다.
    Memcached 캐시
    Memcached는 메모리 기반 캐시입니다. Django가 지원하는 가장 빠르고 효과적인 캐시 시스템입니다.대부분의 장면에 대해memcached를 사용하고 데이터는 서버에 캐시하는 것을 추천합니다.사용하기 전에 pip를 통해memcached를 설치해야 하는 플러그인python-memcached와pylibmc를 사용하면 여러 서버 위의memcached를 동시에 지원할 수 있습니다.
    다음은pyhon-memcached를 사용하는 설정입니다.
    
    # localhost
    CACHES = {
      'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
      }
    }
     
    # unix soket
    CACHES = {
      'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': 'unix:/tmp/memcached.sock',
      }
    }  
     
    CACHES = {
      'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': [
          '172.19.26.240:11211',
          '172.19.26.242:11211',
        ]
        #  , , 
        'LOCATION': [
          ('172.19.26.240:11211',5),
          ('172.19.26.242:11211',1),
        ]
      }
     }
    
    데이터베이스 캐시
    
    CACHES = {
      'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'my_cache_table',
      }
    
    파일 시스템 캐시
    
    CACHES = {
      'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': '/var/tmp/django_cache',# 
        #'LOCATION': 'c:\foo\bar',#windows 
      }
    }
    
    로컬 메모리 캐시
    
    CACHES = {
      'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake'
      }
    }
    
    Django 코드에서 Cache 사용 방법
    Cache 설정을 마치면 코드에서 Cache를 사용할 수 있는 세 가지 방법이 있습니다.
  • 뷰에서 사용됩니다
  • 라우팅 URLConf에서 사용됩니다
  • 템플릿에서 사용
  • 보기View에서cache 사용하기
    
    from django.views.decorators.cache import cache_page
     
    @cache_page(60 * 15)
    def my_view(request):
      ...
    라우팅 URLConf에서 cache 사용하기
    이것은 내가 더 좋아하는 방식이다. 그러면 논리 부분을 담당하는view를 수정할 필요가 없다.
    
    from django.views.decorators.cache import cache_page
     
    urlpatterns = [
      path('foo/<int:code>/', cache_page(60 * 15)(my_view)),
    ]
    
    템플릿에서cache 사용하기
    
    {% load cache %}
    {% cache 500 sidebar request.user.username %}
      .. sidebar for logged in user ..
    {% endcache %}
    
    대부분의 코드 농가에 대해 말하자면, 우리는 django에서cache를 어떻게 사용하는지 알기만 하면 되고, django 백엔드 작업 원리를 상세하게 이해할 필요가 없다. 예를 들어 Django가 선택한 미디어에 데이터를 어떻게 저장하는지, 그리고 django가 캐시가 만료되었는지 판단할 필요가 없다.
    Django에서 Cache를 사용하는 고급 기술
    다음은 Django에서 cache를 사용하는 고급 기술들을 소개해 드리겠습니다.
    cache_ 사용control
    일반적으로 사용자는 두 가지 캐시에 직면하게 될 것이다. 그것은 바로 그나 자신의 브라우저 캐시 (사용 캐시) 와 그 또는 공급자 캐시 (공용 캐시) 이다.공용 캐시는 여러 사용자가 사용하고 다른 사람의 제어를 받는다.예를 들어 당신의 은행 계좌가 공중 캐시에 저장되어 있는 등 당신이 만나고 싶지 않은 민감한 데이터에 대한 문제가 생겼다.따라서 웹 응용 프로그램은 캐시된 데이터가 개인적이고 공공적인지 어떤 방식으로 알려야 한다.
    해결 방안은 어떤 페이지의 캐시가 개인적이어야 한다는 것을 표시하는 것이다.Django에서 이 작업을 완료하려면 cache_control 뷰 손질기:
    
    from django.views.decorators.cache import cache_control
     
    @cache_control(private=True)
    def my_view(request):
    # ...
    
    이 손질기는 백그라운드에서 해당 HTTP 헤더를 전송합니다.
    캐시 파라미터를 제어할 수 있는 다른 방법도 있다.예를 들어, HTTP를 사용하면 다음과 같은 작업을 수행할 수 있습니다.
  • 페이지가 캐시될 수 있는 최대 시간을 정의합니다..
  • 캐시가 항상 최신 버전을 검사하는지 지정합니다. 업데이트가 없을 때만 캐시 내용을 전달합니다
  • Django에서 cache_ 사용 가능control 보기 수식기는 이 캐시 파라미터를 지정합니다.다음 예에서 cache_control은 캐시가 접근할 때마다 캐시를 다시 검증하고 최대 3600초 안에 캐시 버전을 저장한다고 알려 줍니다.
    
    from django.views.decorators.cache import cache_control
     
     
    @cache_control(must_revalidate=True, max_age=3600)
    def my_view(request):
    # ...
    
    캐치에서_control () 에서 모든 합법적인 Cache-Control HTTP 명령은 유효합니다.다음은 전체 목록입니다.
  • public=True
  • private=True
  • no_cache=True
  • no_transform=True
  • must_revalidate=True
  • proxy_revalidate=True
  • max_age=num_seconds
  • s_maxage=num_seconds
  • vary_ 사용on_headers
    기본적으로 Django의 캐시 시스템은 요청한 경로(예: blog/article/1)를 사용하여 캐시 키를 만듭니다.이것은 서로 다른 사용자가 같은 경로를 요청하면 같은 캐시 버전을 얻을 수 있음을 의미한다. 클라이언트user-agent, 쿠키와 언어 설정의 차이를 고려하지 않고 Vary 헤더 알림 캐시 메커니즘을 사용하지 않으면 요청 헤더의 쿠키와 언어의 차이를 고려해야 한다.
    Django에서 이 작업을 수행하려면 편리한 vary_on_headers 보기 장식기.예를 들어 다음 코드는 Django가 캐시 데이터를 읽을 때 User-Agent와 Cookie의 차이를 동시에 고려해야 한다고 알려줍니다.
    
    from django.views.decorators.vary import vary_on_headers
     
    @vary_on_headers('User-Agent', 'Cookie')
    def my_view(request):
      ...
    
    never_ 사용cache 캐시 해제
    만약 당신이 머리로 캐시를 완전히 차단하고 싶다면,django를 사용할 수 있습니다.views.decorators.cache.never_캐치 장식기.만약 보기에서 캐시를 사용하지 않는다면 서버 측은 캐시를 하지 않을 것입니다. 그러나 사용자의 클라이언트인 브라우저와 같은 클라이언트는 데이터를 캐시할 것입니다. 이 때 never_cache는 클라이언트의 캐시를 비활성화합니다.
    
    from django.views.decorators.cache import never_cache
     
    @never_cache
    def myview(request):
    # ...
    이 Django 캐시 캐시 사용에 대한 상세한 설명은 여기 있습니다. 더 많은 Django 캐시 캐시 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보시기 바랍니다. 앞으로 많은 응원 부탁드립니다!

    좋은 웹페이지 즐겨찾기