python - Django को विशिष्ट key_prefix के साथ कैश हटाएं




python-3.x django-views (2)

मैं Django के प्रति दृश्य @cache_page डेकोरेटर का उपयोग कर रहा हूं और प्रत्येक दृश्य के लिए एक अलग key_prefix सेट कर रहा हूं।

मैंने पहले कैश को हटा दिया है:

from django.core.cache import cache
cache.clear()

लेकिन क्या होगा अगर मैं एक विशिष्ट key_prefix वाली चाबियाँ हटाना चाहता key_prefix ? मैं स्पष्ट रूप से डेटाबेस से जुड़कर और कच्चे एसक्यूएल से हटा कर कर सकता हूं लेकिन मुझे आश्चर्य है कि क्या यह 'शुद्ध' Django के साथ किया जा सकता है?

मैं एक डेटाबेस कैश का उपयोग कर रहा हूं, न कि स्मृति कैश

मैं Django 1.11 और Python 3.6 का उपयोग कर रहा हूँ


@ ई ​​4 सी 5 के रूप में उल्लेख किया गया कैश फास्ट स्टैट के लिए उपयोग किया जाता है, आपको उसी के लिए पुनः उपयोग करना चाहिए। लेकिन चूंकि आपका प्रश्न डेटाबेस के बारे में है, इसलिए मैं इसका जवाब दूंगा।

Django में ऐसा करने के लिए कोई मौजूदा फ़ंक्शन नहीं है लेकिन फिर अजगर का सबसे अच्छा हिस्सा आप आसानी से नई कार्यक्षमता जोड़ने के लिए बंदर पथ कर सकते हैं। नीचे मैंने एक टेस्ट अनुरोध बनाया है I

def index(request):
    cache.set("name", "tarun")
    cache.set("name_1", "tarun")
    cache.set("name2", "tarun")
    cache.set("name_4", "tarun")
    cache.set("nam", "tarun")

    cache.clear(prefix="name")
    nam = cache.get("nam")
    name_4 = cache.get("name_4", default="deleted")
    return HttpResponse("Hello, world. nam={nam}, name_4={name_4}".format(nam=nam, name_4=name_4))

prefix कार्यक्षमता प्राप्त करने के लिए आपको कुछ जगह में पैच कोड नीचे जोड़ना होगा। मैंने settings.py इस तरह प्रयोग किया था

original_clear = None


def patch_clear():
    from django.db import connections, router
    from django.core.cache.backends.db import DatabaseCache

    def __clear(self, prefix=None, version=None):
        db = router.db_for_write(self.cache_model_class)
        connection = connections[db]
        table = connection.ops.quote_name(self._table)
        with connection.cursor() as cursor:
            if prefix is None:
                cursor.execute('DELETE FROM %s ' % table)
            else:
                prefix = self.make_key(prefix, version)
                cursor.execute("DELETE FROM %s where cache_key like '%s%%'" % (table, prefix))

    global original_clear
    original_clear = DatabaseCache.clear
    DatabaseCache.clear = __clear

patch_clear()

टीएलडीआर ; cache.delete और cache.delete_many आपके उपलब्ध विकल्प हैं।

लंबा जवाब। @cache_page को रेट किया गया है जब आप इस डेकोरेटर का उपयोग करते हैं, तो आप अक्सर पाते हैं कि कैश में आपके द्वारा अपेक्षा की गई बहुत सी कैश प्रविष्टियां हैं आप कैश प्रविष्टियों के एक पूरे समूह को हटाना चाहते हैं। ऐसा लगता है कि यहां क्या हुआ है।

मैं एक डेटाबेस कैश का उपयोग कर रहा हूं, न कि स्मृति कैश

कैशिंग का उपयोग करने के मुख्य विचारों में से एक यह है कि सर्वर पर लोड को कम करना महंगी गणना या डीबी प्रश्नों को कम करना है। लेकिन वास्तविकता में बहुत सारे वेब पेजों में महंगी गणना नहीं होती है सावधानीपूर्वक आपके अनुक्रमित चुनने से सबसे धीमे प्रश्नों को अनुकूलित किया जा सकता है।

यदि डेटाबेस ही कैश है, तो आप डेटाबेस पर लोड को कम नहीं कर रहे हैं। और अगर आपको अलग-अलग उपयोगकर्ताओं के लिए अलग-अलग सामग्री प्रदर्शित करने की आवश्यकता है? यह बेहद जटिल है।

क्या होगा अगर मैं एक विशिष्ट कुंजी_प्रिफ़िक्स वाली चाबियाँ हटाना चाहता हूं?

Redis का उपयोग करने पर विचार करें यह डीजेंगो में उपलब्ध सर्वोत्तम कैशिंग बैकेंडों में से एक है (एक तृतीय पक्ष मॉड्यूल के रूप में) एक ही कमांड में कई चाबियाँ हटाने में सक्षम होने के नाते रेडिस की कई उपयोगी विशेषताओं में से एक है।





django-cache