Redis
 sql >> डेटाबेस >  >> NoSQL >> Redis

django-redis-cache में @cache_page () डेकोरेटर का कार्य

cache_page डेकोरेटर एक django डेकोरेटर है, न कि django-redis डेकोरेटर। इसलिए, यदि आप django में memcached जैसे डिफ़ॉल्ट कैश का उपयोग कर रहे थे, तो cache_page डेकोरेटर memcached में समान कुंजियाँ बना रहा होता। यहाँ डॉक स्ट्रिंग के साथ डेकोरेटर बेस कोड है:

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

<ब्लॉकक्वॉट>

"" "दृश्यों के लिए डेकोरेटर जो पृष्ठ को कैशे से प्राप्त करने का प्रयास करता है और यदि पृष्ठ अभी तक कैश में नहीं है तो कैश को पॉप्युलेट करता है। कैश को यूआरएल और हेडर से कुछ डेटा द्वारा कुंजीबद्ध किया जाता है। इसके अतिरिक्त मुख्य उपसर्ग है जो है एक बहु-साइट सेटअप में विभिन्न कैश क्षेत्रों को अलग करने के लिए उपयोग किया जाता है। उदाहरण के लिए, आप theget_current_site ()। डोमेन का उपयोग कर सकते हैं, क्योंकि यह एक Django प्रोजेक्ट में अद्वितीय है। इसके अतिरिक्त, प्रतिक्रिया के Vary शीर्षलेख से सभी शीर्षलेख कैशिंग पर खाते में ले लिए जाएंगे - बस जैसे मिडलवेयर करता है।"""

तो, स्वाभाविक रूप से यह कई कुंजी बना रहा है, एक हेडर के लिए और दूसरा HTTPResponse सामग्री के लिए। यह हेडर और सामग्री के आधार पर कुंजी बनाता है, ताकि हेडर में कोई भी बदलाव कैश को अमान्य कर दे (उदाहरण के लिए अलग-अलग हेडर के मामले में), यानी यूआरएल में समान पैरामीटर के साथ भी, लेकिन अनुरोध-हेडर में अलग-अलग सामग्री आपके पास अलग कैश होंगे . विभिन्न अनुरोध-शीर्षकों के उदाहरण अलग-अलग लॉग इन उपयोगकर्ताओं के लिए एक ही पृष्ठ के बारे में लॉगिन जानकारी भेज सकते हैं, या हेडर में मौजूद मोबाइल/डेस्कटॉप उपयोगकर्ता एजेंट जानकारी के आधार पर एक ही यूआरएल के लिए अलग-अलग सामग्री की सेवा कर सकते हैं। यहां 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. जेडिस पाइपलाइन के साथ मूल्य प्राप्त करना

  2. एक ही कार्य को कई बार निष्पादित किया गया

  3. Laravel 5.5 रेडिस कतार बहुत धीमी है

  4. रेडिस कमांड का एसिंक्स निष्पादन

  5. रेडिस में कुशलता से अरबों डेटा कैसे सम्मिलित करें?