क्या मुझे HTML स्ट्रिंग, या ऑब्जेक्ट को स्टोर करने के लिए Transient API का उपयोग करना चाहिए?


18

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

कुछ इस तरह:

/* complex and large query */
$related_posts = get_posts( ... );

$html_output = '';
foreach($related_posts as $key => $item) {
     /* complex layout rendering logic (but not as slow as the previous query) */   
     $html_output .= ...;
}

तो मेरे सवाल हैं:

  • इस तरह के डेटा को कैश करने का सबसे सुरक्षित और सही तरीका क्या है?
  • क्या मुझे कैश $related_postsसरणी, या $html_outputस्ट्रिंग के लिए क्षणिक एपीआई का उपयोग करना चाहिए ? अगर मैं $html_ouputस्ट्रिंग को कैश कर दूंगा , तो क्या यह अधिकतम आकार की सीमा तक पहुंच जाएगा? क्या मुझे बचत करने से पहले, इसे gzip करना चाहिए?
  • क्या मुझे यहाँ पर सब्र का उपयोग करना चाहिए?

जवाबों:


18

क्या मुझे यहाँ पर सब्र का उपयोग करना चाहिए?

नहीं।

एक स्टॉक वर्डप्रेस में ट्रांसफ़ॉर्मर को wp_options टेबल में स्टोर किया जाता है, और केवल कोर अपग्रेड के दौरान साफ ​​किया जाता है। मान लीजिए कि आपके पास 50,000 पद हैं, तो विकल्प तालिका में 50,000 अतिरिक्त पंक्तियाँ हैं। जाहिर है वे ऑटोलैड = नहीं पर सेट हैं, इसलिए यह आपकी सभी मेमोरी का उपभोग नहीं करने वाला है, लेकिन एक और चेतावनी है।

विकल्प तालिका में ऑटोलोड क्षेत्र में एक सूचकांक नहीं है, जिसका अर्थ है कि कॉल को wp_load_alloptions()पूर्ण तालिका स्कैन करने जा रहा है। आपके पास जितनी अधिक पंक्तियाँ होंगी, उतनी ही अधिक समय लगेगा। अधिक बार आप विकल्प तालिका में लिखते हैं, कम कुशल MySQL के आंतरिक कैश हैं।

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

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

एक अन्य महत्वपूर्ण विचार यह है कि वर्डप्रेस के ग्राहक लगातार ऑब्जेक्ट कैशिंग के साथ वातावरण में अस्थिर हो सकते हैं। इसका मतलब यह है कि यदि आप अपने कैश्ड डेटा को 24 घंटे के लिए क्षणिक रूप से संग्रहीत करते हैं, तो इसकी कोई गारंटी नहीं है कि यह 23 घंटे, या 12 या 5 मिनट में उपलब्ध होगा। कई इंस्टॉलेशन के लिए ऑब्जेक्ट कैश बैकेंड एक इन-मेमोरी की-वैल्यू स्टोर है जैसे कि रेडिस या मेम्केच्ड, और अगर नई ऑब्जेक्ट्स को फिट करने के लिए पर्याप्त आवंटित मेमोरी नहीं है, तो पुराने आइटम बेदखल कर दिए जाएंगे। यह मेटा स्टोरेज दृष्टिकोण के लिए एक बहुत बड़ी जीत है।

अमान्य भी हो सकता है, अर्थात आप संबंधित पोस्ट कैश को X घंटे में अमान्य क्यों कर रहे हैं? क्या इसलिए कि कुछ सामग्री बदल गई है? एक नई पोस्ट जोड़ी गई है? एक नया टैग असाइन किया गया है? आपकी "जटिल और बड़ी क्वेरी" के आधार पर आप केवल तभी अमान्य कर सकते हैं यदि ऐसा कुछ हुआ है जो आपकी क्वेरी के परिणामों को बदलने जा रहा है।

क्या मुझे $ संबंधित_पॉज़ सरणी या $ html_output स्ट्रिंग को कैश करने के लिए क्षणिक एपीआई का उपयोग करना चाहिए? अगर मैं $ html_ouput स्ट्रिंग कैश कर दूंगा, तो क्या यह कुछ अधिकतम आकार की सीमा तक पहुंच जाएगा? क्या मुझे बचत करने से पहले, इसे gzip करना चाहिए?

यह आपके स्ट्रिंग के आकार पर बहुत कुछ निर्भर करता है, क्योंकि यह वह डेटा है जो PHP, MySQL, आदि के बीच प्रवाहित होने वाला है। आपको MySQL की सीमा तक पहुँचने के लिए बहुत प्रयास करने की आवश्यकता होगी, लेकिन उदाहरण के लिए मेमेकैड डिफ़ॉल्ट प्रति-ऑब्जेक्ट सीमा है केवल 1 mb।

आपके "जटिल लेआउट रेंडरिंग लॉजिक" को वास्तव में कितना समय लगता है? इसका पता लगाने के लिए इसे एक प्रोफाइलर के माध्यम से चलाएं। संभावना है कि यह बहुत तेज़ है कभी भी अड़चन नहीं बनेगा।

अगर ऐसा है, तो मैं सुझाव दूंगा कि पोस्ट आईडी को कैशिंग करें। WP_Post ऑब्जेक्ट नहीं, क्योंकि उन में पूर्ण पोस्ट सामग्री होगी, लेकिन पोस्ट आईडी की सिर्फ एक सरणी। फिर बस एक कुंजी के WP_Queryसाथ उपयोग करें post__inजिसके परिणामस्वरूप प्राथमिक कुंजी द्वारा बहुत तेजी से MySQL क्वेरी होगी।

यह कहा गया है, यदि प्रति आइटम आवश्यक डेटा काफी सरल है, तो शायद शीर्षक, थंबनेल यूआरएल और पर्मलिंक, तो आप उन तीनों को स्टोर कर सकते हैं, बिना अतिरिक्त राउंड ट्रिप के MySQL में, और कैशिंग के ओवरहेड के बिना बहुत लंबे HTML तार।

वाह यह बहुत सारे शब्द हैं, आशा है कि मदद करता है।


12

सभी WP कोड सार्वजनिक कोड नहीं है

यदि आप कुछ सार्वजनिक जारी करने जा रहे हैं, तो कोवशेनिन ने कहा कि सभी चीजें पूरी तरह से वैध हैं।

यदि आप अपने या अपनी कंपनी के लिए निजी कोड लिखने जा रहे हैं तो चीजें अलग हैं।

किसी भी मामले में बाहरी वस्तु कैश एक बड़ा लाभ है

जब आप कर सकते हैं बाहरी बाहरी वस्तु कैश सेट करने के लिए बहुत अनुशंसित है

ग्राहकों और MySQL के बारे में कोवशीन के जवाब में कही गई सभी बातें बहुत सच हैं, और यह देखते हुए कि WP ही और प्लगइन्स का एक गुच्छा ऑब्जेक्ट कैश का उपयोग करता है ... तो आपके द्वारा प्राप्त प्रदर्शन सुधार, सेटअप करने के लिए बिल्कुल (छोटे) प्रयास के लायक है एक आधुनिक कैश सिस्टम जैसे कि रेडिस या मेमकेड।

कैश्ड मान नहीं हो सकता है: यह ठीक है

इसके अलावा, हाँ, एक बाहरी वस्तु कैश विश्वसनीय नहीं है। आपको इस तथ्य पर कभी भी भरोसा नहीं करना चाहिए कि एक क्षणिक है। आपको यह सुनिश्चित करने की आवश्यकता है कि यह काम करता है यदि कैश नहीं हैं, जहां उन्हें होना चाहिए।

कैश संचय नहीं है, कैश कैश है।

कैश का चयन करें

इस उदाहरण को देखें:

function my_get_some_value($key) {
   // by default no cache when debug and if no external object_cache
   $defUse = ! (defined('WP_DEBUG') && WP_DEBUG) && wp_using_ext_object_cache();
   // make the usage of cache filterable
   $useCache = apply_filters('my_use_cache', $defUse);
   // return cached value if any
   if ($useCache && ($cached = get_transient($key))) {
     return $cached;
   }
   // no cached value, make sure your code works with no cache
   $value = my_get_some_value_in_some_expensive_way();
   // set cache, if allowed
   $useCache and set_transient($key, $value, HOUR_IN_SECONDS);

   return $value;
}

अपने निजी साइट में इस तरह के एक कोड का उपयोग करना, साइट प्रदर्शन में बहुत सुधार हो सकता है , खासकर यदि आपके पास बहुत सारे उपयोगकर्ता हैं।

ध्यान दें कि:

  • डिबग करते समय कैश का उपयोग नहीं किया जाता है, इसलिए उम्मीद है कि आपके विकास के माहौल पर। मेरा विश्वास करो, कैश डिबग को नरक बना सकता है
  • डिफ़ॉल्ट रूप से कैश का उपयोग तब भी नहीं किया जाता है जब WP किसी बाहरी ऑब्जेक्ट कैश का उपयोग करने के लिए सेट नहीं होता है। इसका अर्थ है कि MySQL से जुड़ी सभी समस्याएँ मौजूद नहीं हैं, क्योंकि जब आप MySQL का उपयोग करते हैं तो आप कोई क्षणिक उपयोग नहीं करते हैं। संभवतया आसान विकल्प wp_cache_*कार्यों का उपयोग करना होगा , इसलिए यदि कोई बाहरी कैश सेटअप नहीं है, तो कैश मेमोरी में होता है, और डेटाबेस कभी भी शामिल नहीं होता है।
  • कैश का उपयोग फ़िल्टर करने योग्य है, कुछ किनारे के मामलों को संभालने के लिए जिनका आप सामना कर सकते हैं

नो वेब्सकैल अगर नो कैश

आपको कैश के साथ गति समस्याओं को हल करने का प्रयास नहीं करना चाहिए। यदि आपके पास गति समस्याएं हैं, तो आपको फिर से विचार करना चाहिए कोड।

लेकिन वेबसैल पर एक वेबसाइट को स्केल करने के लिए कैश की बहुत आवश्यकता होती है

और कई बार (लेकिन हमेशा नहीं) टुकड़ा, संदर्भ-जागरूक कैश आक्रामक फुलपेज कैशिंग की तुलना में बहुत अधिक लचीला और उपयुक्त है।

आपके सवाल:

क्या मुझे यहाँ पर सब्र का उपयोग करना चाहिए?

यह निर्भर करता है

क्या आपका कोड बहुत सारे संसाधनों का उपभोग कर रहा है? यदि नहीं, तो शायद कैश की कोई आवश्यकता नहीं है। जैसा कि कहा गया है, केवल गति का मामला नहीं है। यदि आपका कोड तेजी से चलता है, लेकिन इसके लिए एक युगल उपयोगकर्ताओं के लिए सीपीयू और मेमोरी की एक गुच्छा की आवश्यकता होती है ... तब क्या होता है जब आपके पास 100 या 1000 समवर्ती उपयोगकर्ता होते हैं?

अगर आपको लगता है कि कैश एक अच्छा विचार होगा ..

... और सार्वजनिक कोड है: शायद नहीं । आप चुनिंदा रूप से कैश करने पर विचार कर सकते हैं, जैसे कि सार्वजनिक कोड में मेरे उदाहरण के ऊपर, लेकिन आमतौर पर बेहतर होता है कि आप कार्यान्वयनकर्ताओं के लिए ऐसे फैसले छोड़ दें।

... और निजी कोड है: बहुत शायद हाँ । लेकिन निजी कोड के लिए भी, चुनिंदा रूप से कैश करना अभी भी एक अच्छी बात है, उदाहरण के लिए डिबग।

याद रखें, वैसे भी, यह wp_cache_*कार्य आपको प्रदूषणकारी डेटाबेस के जोखिम के बिना कैश तक पहुंच प्रदान कर सकता है।

क्या मुझे $ संबंधित_पॉज़ सरणी या $ html_output स्ट्रिंग को कैश करने के लिए क्षणिक एपीआई का उपयोग करना चाहिए?

यह बहुत सी चीजों पर निर्भर करता है । तार कितने बड़े हैं? आप किस बाह्य कैश का उपयोग कर रहे हैं? यदि आप कैशे पोस्ट करने जा रहे हैं, तो आईडी को स्टोर करना एक अच्छा आइडिया हो सकता है, क्योंकि उनकी आईडी द्वारा पोस्ट की एक अच्छी संख्या को क्वेरी करना काफी तेज है।

अंतिम नोट्स

ट्रांसिएंट एपीआई शायद वर्डप्रेस की सबसे अच्छी चीजों में से एक है। प्लगइन्स के लिए धन्यवाद, आप किसी भी प्रकार के कैश सिस्टम के लिए पा सकते हैं, यह बड़ी संख्या में सॉफ़्टवेयर के लिए एक सरल सरल एपीआई बन जाता है जो हुड के नीचे काम कर सकता है।

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

आप शायद ही कभी मुझे यह कहते हुए सुन सकते हैं कि वर्डप्रेस अन्य आधुनिक चीजों की तुलना में बेहतर है, लेकिन क्षणिक एपीआई उन कुछ चीजों में से एक है जो मुझे वर्डप्रेस के साथ काम नहीं करते हैं।

निश्चित रूप से कैश कठिन है, कोड मुद्दों को हल नहीं करता है और एक चांदी की गोली नहीं है, लेकिन यह कुछ ऐसा है जो आपको काम करने वाले उच्च-ट्रैफ़िक साइट बनाने की आवश्यकता है।

कैश करने के लिए एक अंडर-अनुकूलित MySQL टेबल का उपयोग करने के लिए वर्डप्रेस विचार काफी पागल है, लेकिन अपने आप को कैश से सिर्फ इसलिए दूर रखना बेहतर नहीं है क्योंकि वर्डप्रेस डिफ़ॉल्ट रूप से ऐसा करते हैं।

आपको बस यह समझने की जरूरत है कि चीजें कैसे काम करती हैं, फिर अपनी पसंद बनाएं।


2

पिछले उत्तरों ने पहले ही अनिवार्य " यह निर्भर करता है " पर प्रकाश डाला है , जिससे मैं पूरी तरह सहमत हूं।

हालांकि, मैं कैसे "के आधार पर मैं एक सिफारिश जोड़ना चाहते हैं लगता है " यह सबसे अच्छा परिदृश्य आप ऊपर का वर्णन कर रहे हैं में किया जा जाएगा।

मैं का उपयोग नहीं होता यात्रियों उस मामले में, बल्कि पोस्ट मेटा , क्योंकि में से एक लाभ उत्तरार्द्ध है: नियंत्रण

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

यदि आप अपने पोस्ट मेटा में डेटा को कैश करते हैं, तो आप न केवल यह नियंत्रित कर सकते हैं कि इसे कैसे संग्रहीत और पुनर्प्राप्त किया जाए, बल्कि आप यह भी नियंत्रित कर सकते हैं कि यह कैसे अपडेट किया गया है। आप इसके लिए एक क्रॉन जॉब जोड़ेंगे जो केवल समय अवधि पर चलती है जहां साइट पर कोई ट्रैफ़िक कम है। इसलिए, साइट के वास्तविक उपयोगकर्ताओं द्वारा "धीमी क्वेरी" का सामना कभी नहीं किया जाता है, और आप इसे पहले से लोड भी कर सकते हैं, ताकि पहले आगंतुक के हिट होने पर काम पहले ही हो जाए।

ध्यान रखें कि सभी कैशिंग एक व्यापार बंद है! इसलिए सामान्य उत्तर "यह निर्भर करता है।" और कोई "पवित्र कैशिंग ग्रिल" क्यों नहीं है।

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