Redis
 sql >> база данни >  >> NoSQL >> Redis

Работа на декоратора @cache_page() в django-redis-cache

cache_page декоратор е django декоратор, а не django-redis декоратор. Така че, ако използвате кеш по подразбиране като memcached в django, декораторът на cache_page щеше да прави същите ключове в memcached. Ето основния код на декоратора покрай низа на документа:

https://github.com/django/django/blob/711123e1cdaf3b08c876c045d8d38decdc7a63d3/django/views/decorators/cache.py#L8

"""Декоратор за изгледи, който се опитва да извлече страницата от кеша и попълва кеша, ако страницата все още не е в кеша. Кешът се задейства от URL адреса и някои данни от заглавките. Освен това има ключов префикс, който е използва се за разграничаване на различни области на кеша в настройка на много сайтове. Можете да използвате theget_current_site().domain, например, тъй като това е уникално в Djangoproject. Освен това всички заглавки от заглавката Vary на отговора ще бъдат взети предвид при кеширането - просто като междинния софтуер."""

Така че по своята същност той създава множество ключове, един за заглавки и друг за съдържанието на HTTPResponse. Той създава ключовете въз основа на заглавката и съдържанието, така че всяка промяна в хедъра обезсилва кеша (например в случай на заглавки vary), т.е. дори със същите параметри в URL адреса, но различно съдържание в заглавките на заявката, ще имате отделни кешове . Примери за различни заглавки на заявки могат да бъдат изпращане на информация за вход за една и съща страница за различни влезли потребители или обслужване на различно съдържание за същия URL адрес въз основа на информацията за мобилен/настолен потребителски агент, присъстваща в заглавките. Ето кода на кеша в django :

def _generate_cache_key(request, method, headerlist, key_prefix):
    """Return a cache key from the headers given in the header list."""
    ctx = hashlib.md5()
    for header in headerlist:
        value = request.META.get(header)
        if value is not None:
            ctx.update(force_bytes(value))
    url = hashlib.md5(force_bytes(iri_to_uri(request.build_absolute_uri())))
    cache_key = 'views.decorators.cache.cache_page.%s.%s.%s.%s' % (
        key_prefix, method, url.hexdigest(), ctx.hexdigest())
    return _i18n_cache_key_suffix(request, cache_key)


def _generate_cache_header_key(key_prefix, request):
    """Return a cache key for the header cache."""
    url = hashlib.md5(force_bytes(iri_to_uri(request.build_absolute_uri())))
    cache_key = 'views.decorators.cache.cache_header.%s.%s' % (
        key_prefix, url.hexdigest())
    return _i18n_cache_key_suffix(request, cache_key)


def get_cache_key(request, key_prefix=None, method='GET', cache=None):
    """
    Return a cache key based on the request URL and query. It can be used
    in the request phase because it pulls the list of headers to take into
    account from the global URL registry and uses those to build a cache key
    to check against.
    If there isn't a headerlist stored, return None, indicating that the page
    needs to be rebuilt.
    """
    if key_prefix is None:
        key_prefix = settings.CACHE_MIDDLEWARE_KEY_PREFIX
    cache_key = _generate_cache_header_key(key_prefix, request)
    if cache is None:
        cache = caches[settings.CACHE_MIDDLEWARE_ALIAS]
    headerlist = cache.get(cache_key)
    if headerlist is not None:
        return _generate_cache_key(request, method, headerlist, key_prefix)
    else:
        return None



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. nginx uwsgi websockets 502 Лош шлюз нагоре по веригата преждевременно затворена връзка, докато чете заглавката на отговора от горния поток

  2. Манипулатор на грешка в Spring Redis

  3. spring session redis 'Не е дефиниран боб с име 'springSessionRepositoryFilter''

  4. Коя е най-ефективната ориентирана към документи машина за база данни за съхранение на хиляди документи със среден размер?

  5. Публикуване на абониране с nodejs и redis(node_redis)