Django 구성 캐시 메커니즘

8240 단어
Django 공식 캐치에 대한 설명:https://docs.djangoproject.com/en/dev/topics/cache/
Django는 동적 사이트로 일반적으로 방문한 페이지를 실시간으로 생성하여 방문자에게 전시해야 한다. 이렇게 하면 내용은 수시로 변화할 수 있지만 데이터베이스에서 여러 번 읽고 필요한 데이터를 꺼내면 메모리나 하드디스크 등에서 한 번에 읽는 것보다 비용이 많이 든다.캐시를 사용하면 데이터를 캐시에 저장하고 다음에 방문할 때 캐시에서 데이터를 얻을 수 있으며 백엔드 데이터베이스를 요청하지 않아도 서버가 요청에 빨리 응답하여 마운트 속도를 높일 수 있다.
캐시 시스템 작동 방법:
주어진 웹 주소에 대해 캐시에서 웹 주소를 찾으려고 시도합니다. 만약 페이지가 캐시에 있다면 캐시된 페이지로 바로 돌아가고, 캐시에 없으면 일련의 작업 (예를 들어 데이터베이스 찾기) 을 한 후에 생성된 페이지 내용을 캐시 시스템에 저장해서 다음에 사용할 수 있도록 한 다음에 생성된 페이지 내용을 되돌려줍니다.
일반적으로 우리는 Django로 웹 사이트를 구축하고 데이터베이스 등을 사용해야 한다.
from django.shortcuts import render
def index(request):
    #              
    #             queryset  
    return render(request, 'index.html', {'queryset':queryset})

이렇게 매번 방문할 때마다 데이터베이스를 읽어야 한다. 일반적인 작은 사이트는 문제가 없다. 방문량이 매우 많을 때 데이터베이스 조회가 여러 번 발생하기 때문에 방문 속도가 느려지고 서버 자원이 많이 차지하는 등 문제를 초래할 것이다.
from django.shortcuts import render
from django.views.decorators.cache import cache_page
 
@cache_page(60 * 15) #   ,      15   ,    900        
def index(request):
    #              
    return render(request, 'index.html', {'queryset':queryset})

cache를 사용하면 다음과 같은 액세스 상황이 발생합니다.
#        ,     cache          
#               ,         ,            ,       。
given a URL, try finding that page in the cache
if the page is in the cache:
    return the cached page
else:
    generate the page
    save the generated page in the cache (for next time)
    return the generated page

Django settings의 cache 기본값은 다음과 같습니다.
{
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
    }
}

즉 캐시로 기본값 을 사용하면 속도가 빠르다.물론 메모리가 부족한 경우도 있을 수 있지만, 다른 내장된 일부 Backends는
'django.core.cache.backends.db.DatabaseCache'
'django.core.cache.backends.dummy.DummyCache'
'django.core.cache.backends.filebased.FileBasedCache'
'django.core.cache.backends.locmem.LocMemCache'
'django.core.cache.backends.memcached.MemcachedCache'
'django.core.cache.backends.memcached.PyLibMCCache'

github에서도 Redis가 Django의 캐시 시스템 소스 프로젝트를 만듭니다.https://github.com/niwibe/django-redis, 관심 있는 사람은 볼 수 있어요!
다음은 다양한 캐시 구성에 대해 살펴보겠습니다.
캐시 구성
파일 시스템을 사용하여 캐시하는 방법:
이것은 아주 간단합니다. 지정한 디렉터리에 데이터를 늦추는 것입니다.구성은 다음과 같습니다.
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': '/var/tmp/django_cache',
        'TIMEOUT': 600,
        'OPTIONS': {
            'MAX_ENTRIES': 1000
        }
    }
}

데이터베이스를 이용한 캐시:
명령을 사용하여 테이블을 작성합니다.
$ python manage.py createcachetable my_cache_table

구성은 다음과 같습니다.
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'my_cache_table',
        'TIMEOUT': 600,
        'OPTIONS': {
            'MAX_ENTRIES': 2000
        }
    }
}

Memcache를 사용하여 캐시를 설정하려면:
Memcached는 현재 Django에서 사용할 수 있는 가장 빠른 캐시입니다.
그러나memcache는 당신의 서버 지원이 필요합니다. 즉,memcache 서비스가 필요합니다.
Linux 시스템에Memcached가 설치되어 있으며, 우선libevent 라이브러리를 설치해야 합니다.
$ sudo apt-get install libevent ibevent-dev               (Ubuntu/Debian)

$ yum install libevent libevent-devel                          (Redhat/Fedora/Centos)

그런 다음 명령을 사용하여 Memcache 서비스를 설치합니다.
Ubuntu/Debian
$ sudo apt-get install memcached

Redhat/Fedora/Centos
$ yum install memcached

그리고 pip가Memcached의 플러그인 Python-mencached와pylibmc를 설치해야 합니다
$ pip install Python-mencached
$ pip install pylibmc

마지막으로 세팅에서.py 구성:
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
        'TIMEOUT': 600,
        'OPTIONS': {
            'MAX_ENTRIES': 2000
        }
    }
}

Local-memory를 사용하여 캐시를 설정하려면:
이러한 캐시 방식은 데이터를 서버의 메모리에 저장할 것이다.
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake',
        'TIMEOUT': 600,
        'OPTIONS': {
            'MAX_ENTRIES': 2000
        }
    }
}

가장 추천하는 캐시 방식은 Memcache 또는 Local-memory이다. 아니면 파일 캐시, 데이터베이스 캐시를 가장 추천하지 않는다.
다음은 Django 캐시 시스템을 사용하는 방법에 대한 몇 가지 실례를 보여 줍니다.
Django 캐시 시스템 사용
전체 사이트 캐시
이 방식은 가장 간단하고 쉽게 설정할 수 있습니다. 모든 페이지를 캐시합니다. 설정 방식은 setting.pyMIDDLEWARE 에 추가됩니다.
MIDDLEWARE = [
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',
]

django.middleware.cache.UpdateCacheMiddlewaredjango.middleware.cache.FetchFromCacheMiddleware를 각각 django.middleware.common.CommonMiddleware의 앞과 뒤에 첨가하는 것이니 순서가 바뀌어서는 안 된다.이 방법으로 캐시를 지우면 다음을 사용합니다.
from django.core.cache import cache
cache.clear()

보기 캐시
이런 방식은 캐시할 보기를 지정하고 이 보기만 캐시합니다.
from django.views.decorators.cache import cache_page

@cache_page(60 * 15, key_prefix="site1")
def my_view(request):
    ...
cache_page의 매개 변수는 캐시 만료 시간과 캐시 키의 접두사입니다.라우팅url.py에서 캐시할 페이지를 지정할 수도 있습니다.
from django.views.decorators.cache import cache_page

urlpatterns = [
    url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)),
    #     ,       classbase  :
    url(r'^$', cache_page(60 * 60 * 10, key_prefix="blogindex")(views.IndexView.as_view()), name='index'),
]

보기가 class base이면 캐시를 사용할 수 있습니다.
from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_page
from django.views.generic import ListView

@method_decorator(cache_page(60*60), name='dispatch')
class MyListView(ListView):
    # Your view code here.

보기 캐시를 지우는 방법:
django에서 cache 사용 가능페이지 방식으로 보기를 캐시하지만, 지정한 보기의 캐시를 어떻게 삭제합니까?문서에서 지우는 방법을 찾지 못했지만 Google에서 솔루션을 찾았습니다. 로컬 테스트를 통해 사용할 수 있으며, 향후 버전이 올바르지 않을지 확실하지 않습니다. 해결 방법은 다음과 같습니다.
핵심 기능은 다음과 같습니다.
def expire_view_cache(path, servername, serverport, key_prefix=None):
    from django.http import HttpRequest
    from django.utils.cache import get_cache_key

    request = HttpRequest()
    request.META = {'SERVER_NAME': servername, 'SERVER_PORT': serverport}
    request.path = path

    key = get_cache_key(request, key_prefix=key_prefix, cache=cache)
    if key:
        if cache.get(key):
            cache.delete(key)
        return True
    return False

사실은 HttpRequest 대상을 만들고 Django 내부get_cache_key를 호출해서 캐시 키를 얻는 것이다.호출 방법:
#site       ,        domain name
from django.contrib.sites.models import Site
site = Site.objects.get_current().domain
#path            ,key_prefix   cache_page    key_prefix
expire_view_cache(path, servername=site, serverport=port, key_prefix='blogdetail')

템플릿 캐시
물론, 템플릿에서 캐시를 직접 사용할 수도 있다
{% load cache %}
{% cache 500 sidebar request.user.username %}
    .. sidebar for logged in user ..
{% endcache %}

매개 변수는 각각 기한이 지난 시간, 캐시 이름, 서로 다른 캐시를 구분하는 매개 변수 모델 캐시의 삭제 방식이 훨씬 간단합니다. 위의 설정을 예로 들면 다음과 같습니다.
from django.core.cache.utils import make_template_fragment_key
from django.core.cache import cache
username = self.request.user.username if self.request.user else ''
key = make_template_fragment_key('sidebar', [username])
cache.delete(key)

Django 설정 캐시 메커니즘

좋은 웹페이지 즐겨찾기