Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Działanie dekoratora @cache_page() w django-redis-cache

cache_page decorator jest dekoratorem django, a nie dekoratorem django-redis. Tak więc, jeśli używasz domyślnej pamięci podręcznej, takiej jak memcached w django, dekorator cache_page tworzyłby te same klucze w memcached. Oto kod bazowy dekoratora wzdłuż ciągu doc:

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

"""Dekorator widoków, który próbuje pobrać stronę z pamięci podręcznej i wypełnia pamięć podręczną, jeśli strona nie jest jeszcze w pamięci podręcznej. Pamięć podręczna jest kluczowana przez adres URL i niektóre dane z nagłówków.Dodatkowo istnieje prefiks klucza, który jest używane do rozróżniania różnych obszarów pamięci podręcznej w konfiguracji z wieloma witrynami.Możesz użyć na przykład get_current_site().domain, ponieważ jest to unikalne w całym projekcie Django.Dodatkowo wszystkie nagłówki z nagłówka Vary odpowiedzi będą brane pod uwagę podczas buforowania - po prostu jak oprogramowanie pośredniczące."""

Tak więc z natury tworzy wiele kluczy, jeden dla nagłówków, a drugi dla treści HTTPResponse. Tworzy klucze na podstawie nagłówka i treści, dzięki czemu każda zmiana w nagłówku unieważnia pamięć podręczną (na przykład w przypadku różnych nagłówków), tj. nawet przy tych samych parametrach w adresie URL, ale innej zawartości w nagłówkach żądań będziesz miał oddzielne pamięci podręczne . Przykładami różnych nagłówków żądań mogą być wysyłanie informacji logowania o tej samej stronie dla różnych zalogowanych użytkowników lub udostępnianie różnych treści dla tego samego adresu URL w oparciu o informacje o kliencie użytkownika mobilnego/komputera znajdujące się w nagłówkach. Oto kod klucza pamięci podręcznej w 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. Jak używać ActionController::Live wraz z Resque + Redis (dla aplikacji Chat)

  2. Jak debugować polecenie błędu OOM niedozwolone, gdy używana pamięć> „maxmemory” w Redis?

  3. Jak redis wygasa klucze?

  4. Użyj redis, aby zbudować czat w czasie rzeczywistym za pomocą socket.io i NodeJs

  5. Po uruchomieniu kwiatka otrzymuję następujące informacje:dbm.error:typ db to dbm.gnu, ale moduł nie jest dostępny