django의 캐시 메커니즘

11583 단어
django 캐시 설정
1. 캐시 설정
  • Django는 데이터베이스, 파일 및 메모리 기반 캐시를 지원합니다.일반적으로 우리는 먼저 그것을 설정해야 한다.Django 캐시에 대한 설정은 settings에 있습니다.py의 CACHES 구성 항목에 있습니다.
  • Django는 다음과 같은 캐시 시스템을 지원합니다
  • .
    1. Memcached
  • Memcached는 Django가 기본적으로 지원하는 캐시 시스템으로 속도가 빠르고 효율이 높다.Memcached는 메모리 기반 캐시 서비스로 처음에는 LiveJournal을 해결하기 위한 것이다.com 소셜네트워크서비스의 부하 문제로 개발된 것으로 나중에 Danga사가 개설했다.페이스북이나 위키백과와 같은 대형 사이트에서 사용되며 데이터베이스 방문 횟수를 줄여 사이트의 성능을 현저히 향상시켰다.
  • Memcached는 데몬을 시작하고 별도의 메모리 블록을 할당합니다.그 주요 업무는 캐시에 빠른 추가, 검색, 삭제 인터페이스를 제공하는 것이다.모든 데이터는 메모리에 직접 저장되기 때문에 데이터베이스나 파일 시스템의 기능을 대체할 수 없다.만약 네가 캐시에 익숙하다면, 이 내용들은 모두 이해하기 쉽다.

  • 만약 당신이 신출내기라면 똑똑히 알아야 한다.
  • Memcached는 Django가 자체로 가지고 있는 소프트웨어가 아니라 독립된 소프트웨어로 서비스 설치, 설정, 시작이 필요합니다.
  • Memcached가 설치된 후에 Python이 Memcached를 조작하는 의존 라이브러리도 설치해야 한다. 가장 자주 사용하는 것은python-memcached와pylibmc이다.
  • 상기 두 조건이 모두 충족되면 Django에서 배치해야 한다.

  • 구성 방법:
  • 설치된 파이톤 의존 라이브러리에 따라 CACHES의 BACKEND를
    django.core.cache.backends.memcached.MemcachedCache
      django.core.cache.backends.memcached.PyLibMCCache
  • 로 설정합니다.
  • Memecached 데몬이 있는 호스트 IP와 프로세스 포트를 설정합니다. ip:port 형식의 문자열입니다.또는 Unix: path 형식으로 Unix 운영체제에 있습니다.
  • 다음은 참고 예이다. Memcached는 localhost (127.0.0.1) port 11211에서 실행되고 python-memcached 라이브러리를 사용했다.
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
            'LOCATION': '127.0.0.1:11211',
        }
    }
  • 아래의Memcached는 로컬 Unix socket에서 실행됩니다. /tmp/memcached.sock, 의존python-memcached:
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
            'LOCATION': 'unix:/tmp/memcached.sock',
        }
    }
  • 아래의Memcached는 /tmp/memcached.sock에서 실행되고 unix:/ 접두사 없이pylibmc 라이브러리에 의존합니다.
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
            'LOCATION': '/tmp/memcached.sock',
        }
    }
  • Memcached는 분포식 서비스를 지원하고 여러 기기에서 동시에 실행할 수 있으며 그들의 IP 주소를 LOCATION에 추가할 수 있다. 다음과 같다.
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
            'LOCATION': [
                '172.19.26.240:11211',
                '172.19.26.242:21423',
                '172.19.26.244:11213',
            ]
        }
    }
  • 메모리 기반 캐시 시스템의 뚜렷한 단점은 단전 데이터 분실이다. 특히 Memcached와 같은 서열화된 캐시가 지원되지 않기 때문에 데이터의 안전성에 주의해야 한다.
    사실 현재는 리디스가 캐시로서 더 좋고 서열화도 지원합니다.
    2. 데이터베이스 캐시
  • 우리가 캐시를 사용하는 가장 큰 원인은 바로 데이터베이스의 조작을 줄이는 것이다. 만약에 캐시를 데이터베이스에 다시 저장하면 쓸모가 없다.따라서 데이터베이스 기반 캐시를 최대한 사용하지 말고 여기서도 구체적으로 소개하지 않고 간단한 설정 예를 제시하세요.
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
            'LOCATION': 'my_cache_table',  #       
        }
    }
    #  :                  python manage.py createcachetable 
  • 그러나 어떤 경우에도 일부 용도가 있다. 예를 들어 당신은 고속, 효율적인 인덱스 데이터베이스를 가지고 있다.
    redis 캐시
  • 준비 소프트웨어:django-redis 제3자 모듈
  • 시작:
  • 설치: pip install django-redis
  • 구성: settings.py
    CACHES = {
        "default": {
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "redis://127.0.0.1:6379/1",
            "OPTIONS": {
               "CLIENT_CLASS": "django_redis.client.DefaultClient",
            }
        }
    }
  • 구성 session backend로 사용
    SESSION_ENGINE = "django.contrib.sessions.backends.cache"
    SESSION_CACHE_ALIAS = "default"
  • 3. 파일 시스템 캐시
  • 데이터베이스조차 느리다고 생각하는데 파일 시스템 기반은?더 느려!하지만 레드스, Memcached, 데이터베이스가 없을 때도 간신히 사용해 보세요.다음과 같은 두 가지 구성 사례가 있습니다
  • .
  • Unix 시스템 기반:
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
            'LOCATION': '/var/tmp/django_cache',
        }
    }
    
  • Windows OS 기반, 디스크 경로 필요
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
            'LOCATION': 'c:/foo/bar',
        }
    }
    
  • 4. 로컬 메모리 기반 캐시
  • 로컬 호스트 메모리가 충분하고 빠르면 캐시로 사용할 수도 있습니다.구성:
    CACHES = {
        'default': {
          'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
          'LOCATION': 'unique-snowflake',
             #       (  300,None      ,0      )
          'TIMEOUT': 300, 
          'OPTIONS':{
                      #       (  300)
                        'MAX_ENTRIES': 300,   
                      #           ,         , :1/CULL_FREQUENCY(  3)
                        'CULL_FREQUENCY': 3,  
                    },
              } 
          }
    
    #     
    from django.views.decorators.cache import cache_page@cache_page(5)  #       ,5    
    def student_list(request, *args, **kwargs):  
        students = models.Student.objects.all()  
        print('students')  
        return render(request, 'student_list.html', {'students': students})
    
  • 5. 시험용 캐시 개발
  • Django는 우리를 위해 개발용 캐시를 매우 친근하게 설계했다.당신의 생산 환경이 대형 캐시 시스템이고 개발할 때 그에 상응하는 캐시 시스템 지원이 없거나 그런 육중한 녀석으로 개발하고 싶지 않다.그러나 실제 개발 과정에서 당신은 캐시 시스템에 접속하여 캐시의api를 사용해야 합니다. 이런 상황에서 개발용 캐시가 매우 편리합니다.
  • 구성은 다음과 같습니다.
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.dummy.DummyCache',    
            'TIMEOUT': 300, #       (  300,None      ,0      )
         'OPTIONS':{
                      #       (  300)
                        'MAX_ENTRIES': 300,   
                      #           ,         , :1/CULL_FREQUENCY(  3)
                        'CULL_FREQUENCY': 3,  
                    },
          'KEY_PREFIX': '',        #   key   (   )
             'VERSION': 1,            #   key   (  1)
             'KEY_FUNCTION':       #   key   (        :【  :  :key】)
        }
    }
    
  • 6. 캐시 백엔드 사용자 정의
  • 최고 경지는 당연히 자신이 개발한 캐시 시스템을 사용하는 것이다. Django는 지원하지만 전제는 네가 그 능력을 가져야 한다는 것이다!간단한 구성:
    CACHES = {
        'default': {
            'BACKEND': 'path.to.backend',
        }
    }
    
  • 7. 캐시 매개 변수
  • 위의 각 캐시 백엔드는 다음과 같은 추가 매개 변수를 설정하여 캐시 동작을 제어할 수 있습니다.
  • TIMEOUT: 캐시의 기본 만료 시간은 초 단위이고 기본 300초 None은 영원히 만료되지 않는다는 것을 의미한다.0으로 설정하면 캐시가 즉시 효력을 상실합니다. (캐시가 의미가 없습니다.)
  • OPTIONS: 캐시 백엔드에 따라 선택할 수 있는 매개 변수입니다.
  • KEY_PREFIX: Django 서버에서 사용하는 모든 캐시 키의 문자열입니다.
  • VERSION: Django 서버에서 생성된 기본 버전 번호입니다.
  • KEY_FUNCTION: 함수의 점 경로를 포함하는 문자열입니다. 이 함수는 접두사, 버전과 키를 최종 캐시 키로 조합하는 방법을 정의합니다.

  • 다음 예에서 파일 시스템 기반 캐시 백엔드를 설정했는데 캐시 만료 시간은 60초, 최대 항목은 1000초로 설정되었다.
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
            'LOCATION': '/var/tmp/django_cache',
            'TIMEOUT': 60,
            'OPTIONS': {
                'MAX_ENTRIES': 1000
            }
        }
    }
    
  • 다음 예는python-memcached 라이브러리 기반 백엔드를 설정했는데 대상 크기는 2MB로 제한되어 있다.
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
            'LOCATION': '127.0.0.1:11211',
            'OPTIONS': {
                'server_max_value_length': 1024 * 1024 * 2,
            }
        }
    }
    
  • 다음은pylibmc 라이브러리의 백엔드 설정을 바탕으로 이 백엔드는 2진 프로토콜,SASL 인증과ketama 행위 모드를 사용합니다:
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
            'LOCATION': '127.0.0.1:11211',
            'OPTIONS': {
                'binary': True,
                'username': 'user',
                'password': 'pass',
                'behaviors': {
                    'ketama': True,
                }
            }
        }
    }
    
  • 2. 전역 응용 캐시
  • 캐시 시스템의 가장 간단한 사용 방법은 전체 사이트를 캐시하는 것이다.
  • 'django'를 추가해야 합니다.middleware.cache.UpdateCacheMiddleware'와'django.middleware.cache.FetchFromCacheMiddleware'는 MIDDLEWARE 설정에 다음과 같이 추가됩니다.
    MIDDLEWARE = [
        'django.middleware.cache.UpdateCacheMiddleware',  #          
        #      ...
        'django.middleware.cache.FetchFromCacheMiddleware', #       ]
    
  • 주의: update 중간부품은 목록의 시작 위치에 놓아야 하고, fectch 중간부품은 마지막에 놓아야 한다.이것은 Django가 중간부품을 사용하는 규칙입니다. 이것은 순서 관계가 있고 위에서 아래로 순서대로 실행됩니다.요청이 오면 중간부품 프로세스를 실행합니다request 방법, 이럴 때 캐시에 데이터가 있는지 없는지,fectch 중간부품에 프로세스가 하나 있음request 방법은 캐시 데이터를 가져오는 데 사용되며, 루트가 일치하지 않으면 데이터를 되돌려주기 때문에 마지막에 두어야 합니다.데이터가 브라우저에 되돌아갈 때 캐시를 업데이트하고 캐시에 넣기 때문에 업데이트 중간부분에 프로세스가 있습니다response 방법은 캐시 데이터를 업데이트하는 데 사용되기 때문에 맨 위에 놓습니다.
  • 그리고 다음에 필요한 매개 변수를 settings 파일에 추가합니다.
    CACHE_MIDDLEWARE_ALIAS :           
    CACHE_MIDDLEWARE_SECONDS :   page        .
    CACHE_MIDDLEWARE_KEY_PREFIX :     
    
  • 3. 보기 응용 캐시
  • 또 다른 캐시 프레임워크를 사용하는 방법은 보기의 출력을 캐시하는 것이다.django.views.decorators.cache는 보기 응답 결과를 자동으로 캐시하는 장식기cache_page를 정의했습니다. 사용은 매우 간단합니다.
    from django.views.decorators.cache import cache_page
    
    @cache_page(60 * 15)
    def my_view(request):
        ...
    
    cache_page는 매개 변수를 받아들입니다. timeout, 초 단위입니다.상례에서 my_view() 보기의 결과는 15분간 캐시됩니다. (가독성을 높이기 위해 60* 15로 작성됨)
  • 보기 캐시는 사이트 캐시와 마찬가지로 URL과 무관합니다.여러 URL이 동일한 뷰를 가리키는 경우 각 URL은 각각 캐시됩니다.계속myview의 예를 들어 URLconf가 다음과 같다.
    urlpatterns = [
        url(r'^foo/([0-9]{1,2})/$', my_view),
    ]
    
    그러면 /foo/23//foo/1/ 에 보내는 요청은 각각 캐시됩니다.그러나 명확한 URL(예를 들어 /foo/23/이 요청되면 다시 이 URL을 가리키는 요청은 캐시된 내용을 사용합니다.
  • cache_page도 일부 추가 파라미터를 사용할 수 있다. 예를 들어cache, 이 파라미터는 구체적으로 사용하는 캐시 백엔드를 가리킨다.
    @cache_page(60 * 15, cache="special_cache")
    def my_view(request):
        ...
    
  • 옵션 키워드 매개 변수key_prefix를 사용하여 각 보기에 구체적인 캐시 접두사를 지정할 수 있다.
    @cache_page(60 * 15, key_prefix="site1")
    def my_view(request):
        ...
    
  • 4. 캐시 템플릿 세션
  • 우리는 cache 템플릿 탭을 사용하여 템플릿의 한 부분을 캐시할 수 있다.이 라벨을 사용하려면 먼저 모델의 맨 위에 {% load cache %}를 추가해야 한다.
  • 템플릿 레이블{% cache %}은 지정된 시간 동안 캐시 레이블 블록에 포함됩니다.최소한 두 개의 인자가 필요합니다. 캐시 시간 (초 단위) 과 캐시 세션에 대한 이름입니다.이렇게:
    {% load cache %}
    {% cache 500 sidebar %}
        .. sidebar ..
    {% endcache %}
    
  • 세션 내의 동적 내용에 따라 여러 버전을 캐시할 수 있다.위의 예에서 사이트의 모든 사용자에게 서로 다른 버전의sidebar 캐시를 생성할 수 있습니다.{% cache %} 탭에 이 캐시 세션을 구분하는 매개 변수를 전달하면 다음과 같다.
    {% load cache %}
    {% cache 500 sidebar request.user.username %}
        .. sidebar for logged in user ..
    {% endcache %}
    
  • 캐시 시간 초과 파라미터는 템플릿 변수일 수 있으며 템플릿 변수가 정수치로 해석될 수만 있다면 된다.예를 들어, 템플릿 변수 mytimeout을 600으로 설정하면 다음 두 가지 예는 같은 효과가 있습니다:
    {% cache 600 sidebar %} ... {% endcache %}
    {% cache my_timeout sidebar %} ... {% endcache %}
    
  • 참고: 출처https://blog.csdn.net/weixin_39726347/article/details/88035356

    좋은 웹페이지 즐겨찾기