मैं db_query () के परिणाम को कैसे कैश करूं?


9

मुझे views_get_view_result()एक दृश्य से परिणाम मिलते थे क्योंकि यह उस समय सुविधाजनक था। क्वेरी परिणाम शायद ही कभी बदलता है; मैं 6 दिनों के लिए कैशिंग विचारों का उपयोग कर सकता हूं।

अगर मैं इसे कॉल में बदलना चाहता हूं तो मैं db_query()कैशिंग को कैसे सक्षम कर सकता हूं?

जवाबों:


9

यदि आप दृश्य या db_query () का उपयोग करते हैं तो कैशिंग के लिए मैटर नहीं करता है। कैशिंग हमेशा एक ही काम करता है, जब कैश की कमी पूरी तरह से आपके ऊपर है तो डेटा कैसे लाया जाता है।

  1. अपने कैश प्रविष्टि की पहचान करने के लिए कैश आईडी बनाएं। तर्कों और इतने पर आधारित एक सरल, हार्डकोड स्ट्रिंग या कुछ जटिल हो सकता है।
  2. जांचें कि क्या कैश से लोड हो सकता है।
  3. यदि नहीं, तो डेटा का पुनर्निर्माण करें और इसे वांछित समाप्ति समय के साथ कैश में डालें।

कुछ उदाहरणों को देखने के लिए, आप उन कार्यों को देख सकते हैं जो cache_get () का उपयोग करते हैं , उदाहरण के लिए variable_initialize ()

यदि आपके फ़ंक्शन को कई बार कहा जाता है, तो आप शायद इसे स्थैतिक कैश के साथ जोड़ना चाहते हैं, उदाहरण के लिए archiver_get_info () देखें । और यदि डेटा पुनर्निर्माण वास्तव में धीमा है, तो आप इसे लॉकिंग फ्रेमवर्क का उपयोग करके कई बार होने से रोक सकते हैं जैसे कि variable_initialize () करता है।

ध्यान दें कि किसी एकल क्वेरी को कैशिंग करना केवल तभी समझ में आता है यदि यह एक धीमा है, क्योंकि एक कैश_गेट () भी एक डीबी क्वेरी है जब तक कि आप एक वैकल्पिक कैश बैकेंड का उपयोग नहीं करते हैं जैसे कि मेमाकैश।

और अंत में, व्यू में पहले से ही अंतर्निहित कैशिंग है और इसे आपके विचार में कॉन्फ़िगर किया जा सकता है। तो यह एक विकल्प भी हो सकता है।


मुझे यह करने के लिए मारो;) मैं एक कोड उदाहरण के रूप में मेरा उत्तर ऊपर छोड़ देंगे लेकिन इस तरह से और अधिक उपयोगी जानकारी है
क्लाइव

मुझे लगा कि पीडीओ के उदाहरण सीरियल योग्य नहीं थे?
mpdonadio

1
नहीं, वे नहीं हैं, लेकिन यह प्रासंगिक नहीं है। आप pdo परिणाम संसाधन को कैश नहीं करते हैं, आप उस क्वेरी से जो भी डेटा स्ट्रक्चर्स लाते हैं उसे कैश करते हैं।
बर्दिर

मैं कहूंगा कि यह बहुत प्रासंगिक है। @MotoTribe से कैशिंग परिणाम के बारे में पूछ रहा था db_query(), और मूल्य से कैश करने के लिए $results->fetchAll()और $resultsवास्तव में इसे काम करने के लिए महत्वपूर्ण नहीं है।
mpdonadio

7

मुझे नहीं लगता कि डीबी की परत किसी भी कैशिंग तंत्र (हालांकि मैं गलत हो सकता है) में बनाया गया है, लेकिन आप डिफ़ॉल्ट कैश एपीआई का उपयोग कर सकते हैं।

यह सिर्फ एक मूल उदाहरण है जो किसी निश्चित प्रकार के नोड प्राप्त करने के लिए क्वेरी के परिणामों को कैश करेगा:

function MYMODULE_get_nodes_by_type($type) {
  // Setup a cache ID
  $cid = 'MYMODULE:node_types:' . $type;

  // If a cached entry exists, return it
  if ($cached = cache_get($cid)) {
    return $cached->data;
  }

  // Otherwise load the data
  $data = db_query('SELECT * FROM {node} WHERE type = :type', array(':type' => $type))->fetchAll();

  // And cache it
  cache_set($cid, $data, 'cache', strtotime('+6 days'));
}

3

Drupal द्वारा प्रदान किए जाने वाले मानक cache_set / cache_get तंत्र के अलावा , यदि आप MySQL को अपने डेटाबेस के रूप में उपयोग कर रहे हैं, तो आप क्वेरी कैश को सक्षम कर सकते हैं , जो विचारों के परिणामों, या किसी अन्य डेटाबेस क्वेरी को पारदर्शी रूप से कैश कर सकते हैं। mysqltuner कैश आकार के लिए अच्छे मूल्यों का पता लगाने में सहायता कर सकता है।

बस ध्यान दें कि यदि आप डेटाबेस पर बहुत अधिक लेखन कर रहे हैं, तो कैश कैशेलेशन स्ट्रैटेजी काम करने के तरीके के कारण क्वेरी कैशिंग कम प्रभावी हो जाती है (तालिका में लिखने से सभी प्रविष्टियों को अमान्य कर दिया जाता है जो उस तालिका का चयन करें या उसमें शामिल हों)।

PostgreSQL के लिए एक कैशिंग तंत्र भी है , लेकिन मुझे इसके साथ प्रत्यक्ष अनुभव नहीं है।


3

मैंने हाल ही में कैश एक्ट्स मॉड्यूल की खोज की । इस मॉड्यूल के साथ, आप अपने दृश्य कैशिंग को नियम-ट्रिगर कैश में सेट कर सकते हैं और विशिष्ट विचारों और विचारों के प्रदर्शन पर कैश को अमान्य करने के लिए एक नियम बना सकते हैं।

उदाहरण के लिए, एक दृश्य के लिए कैश जो एक विशिष्ट सामग्री प्रकार के नोड्स को सूचीबद्ध करता है, जब उस सामग्री प्रकार का एक नया नोड बनाया जाता है, तो उसे खाली किया जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.