sql >> Database teknologi >  >> NoSQL >> Redis

Arbejder med @cache_page() dekorator i django-redis-cache

cache_page dekoratør er en django dekoratør, ikke en django-redis dekoratør. Så hvis du brugte en standardcache som memcached i django, ville cache_page-dekoratøren have lavet de samme nøgler i memcached.Her er dekoratørens basiskode langs doc-strengen:

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

"""Dekorator til visninger, der forsøger at hente siden fra cachen og udfylder cachen, hvis siden ikke er i cachen endnu. Cachen indtastes af URL'en og nogle data fra overskrifterne. Derudover er der nøglepræfikset, der er bruges til at skelne mellem forskellige cache-områder i en multi-site-opsætning. Du kan f.eks. bruge theget_current_site().domænet, da det er unikt på tværs af et Django-projekt. Derudover vil alle overskrifter fra svarets Vary-header blive taget i betragtning ved cachelagring -- bare ligesom middleware gør."""

Så i sagens natur er det at skabe flere nøgler, en til headere og en anden til HTTPResponse-indholdet. Det opretter nøglerne baseret på header og indhold, så enhver ændring i header ugyldiggør cachen (for eksempel i tilfælde af vary headers), dvs. selv med samme parametre i url'en, men forskelligt indhold i request-headers vil du have separate caches . Eksempler på forskellige anmodnings-headere kan være at sende login-oplysninger om samme side for forskellige loggede brugere eller at vise forskelligt indhold for samme url baseret på mobil-/desktopbrugeragentoplysninger, der findes i headers. Her er cache-nøglekoden i 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. MongoDB:er det sikkert at bruge dokumentets ID offentligt?

  2. RDBTools er blevet opkøbt af RedisLabs!

  3. Mongo Triple Compound Index

  4. Mongodb Query Til at vælge poster med en given nøgle