Django 구성 캐시 메커니즘
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.py
의 MIDDLEWARE
에 추가됩니다.MIDDLEWARE = [
'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
]
즉
django.middleware.cache.UpdateCacheMiddleware
와 django.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 설정 캐시 메커니즘
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.