पृष्ठांकित परिणामों के कैशिंग के लिए सर्वोत्तम अभ्यास क्या हैं जिनके क्रम / गुण बदल सकते हैं?


11

पृष्ठांकित खोज परिणामों को कैशिंग करने के लिए सबसे अच्छा अभ्यास क्या है जिसके आदेश / गुणों को बदला जा सकता है?

कहते हैं, मेरे आवेदन में, कोई अंतिम 20 चर्चा सूत्र (10,000 में से) देखना चाहता है। अनुरोध servletथ्रेड टेबल से XML / JSON के रूप में पहले 20 रिकॉर्ड लाने के लिए , डेटाबेस के माध्यम से एक अनुरोध भेजा जाएगा । यदि वे फिर अगले 20 देखना चाहते हैं, तो वे परिणामों के अगले पृष्ठ पर जाते हैं और यह अगले बहुत कुछ प्राप्त करने के लिए एक और अनुरोध निकालता है (सीमा और ऑफसेट = 20, आदि)।

सर्वर लोड और क्लाइंट-वेटिंग को कम करने के लिए, मैं परिणामों के पिछले पृष्ठों को कैश करना चाहूंगा। हालाँकि, मेरे दो सवाल हैं:

  1. परिणाम जिस तालिका में दिखाए गए हैं वह एक से अधिक विशेषताओं (यानी, थ्रेड-क्रिएशन-डेट, थ्रेड-ऑथर, लास्ट-पोस्ट-डेट) द्वारा आदेशित किया जा सकता है। इसका मतलब यह है कि 'पहले 20 परिणाम' जैसे बयान का संदर्भ के बिना कोई मतलब नहीं है (यानी, हम क्या आदेश दे रहे हैं)। फ्रंट-एंड कैसे करता है, फिर, बैक-एंड को यह बताएं कि यह पहले से लोड हो चुका है? मेरा पहला विचार प्रत्येक परिणाम के लिए आईडी का उपयोग करना था, लेकिन बाद के अनुरोधों पर सर्वर को वापस भेजना (और उन पर आधारित परिणामों को फ़िल्टर करना) बस समय लेने वाली के रूप में सब कुछ नेत्रहीन वापस भेजना होगा। मैं यह कैसे कर सकता हूँ?
  2. क्या होगा यदि पहले से लौटाए गए परिणाम (यानी, सबसे हाल ही में पोस्ट-डेट) की एक विशेषता बदल गई है? इसके बाद हमें यह देखने के लिए प्रत्येक परिणाम की जाँच करने के तरीके की आवश्यकता है कि क्या यह सर्वर-साइड संशोधित किया गया है क्योंकि इसमें पृष्ठांकित किया गया है। मैं यह कैसे कर सकता हूं?

आपका उदाहरण थोड़ा मोटा है। यदि यह केवल 100 धागे हैं, तो आप एक बार में सभी 100 डाउनलोड करना सबसे अच्छा हो सकता है। यदि आप 10,000 में से 20 को खींच रहे हैं, तो यह एक अलग कहानी है।
Dan Pichelman

@DanPichelman क्षमा करें, मैं थोड़ा अस्पष्ट था। यह 10,000 की तरह अधिक होगा।
वस्त्राभूषण

स्पष्टता के लिए संपादित संख्या।
वस्त्राभूषण

क्या यह http? अगर ऐसा है, तो सिर्फ url के आधार पर कैश क्यों नहीं? Url में सभी पैरामीटर हैं। यदि यह ब्राउज़र ब्राउज़र कैश का उपयोग करने का प्रयास करता है। यदि यह एक ऐप है, तो कैश एक्सपायरी सेट करें। Android का वॉली काफी अच्छा काम करता है।
४ous में

जवाबों:


7

ऐसा लगता है कि तुम क्या जरूरत है सभी मापदंडों है कि एक पृष्ठ को परिभाषित (जैसे कि, के लिए एक आवरण है pageNumber, pageSize, sortType, totalCount, आदि) और इस का उपयोग DataRequestअपने कैशिंग तंत्र के लिए कुंजी के रूप में वस्तु। इस बिंदु से आपके पास कैश को संभालने के लिए कई विकल्प हैं:

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

पहले दो में कुछ अंतराल या किसी घटना के आधार पर ट्रिगर करने के लिए एक अनुसूचक तंत्र शामिल हो सकता है। यदि आपके पास एकल डेटा एक्सेस बिंदु है, तो अंतिम सबसे सरल हो सकता है।

अंत में, जैसा कि @DanPichelman ने उल्लेख किया है, यह जल्दी से एक अति जटिल एल्गोरिथ्म बन सकता है जो लाभों से आगे निकल जाता है, इसलिए सुनिश्चित करें कि प्रदर्शन में लाभ एल्गोरिथम की जटिलता को सही ठहराता है।


3

मैं शायद इसे इस तरह से संभालूंगा:

  1. सभी अलग-अलग क्रमों को अलग-अलग क्रम से समझें। यह अतिरिक्त बहीखाता पद्धति को ट्रैक करने के लायक नहीं होगा कि प्रत्येक ग्राहक के पास क्या है (या इसे वापस भेज दें)।
  2. जब भी उपयोगकर्ता पृष्ठ, कैश से तुरंत प्रदर्शित होते हैं, उसी समय सर्वर पर एक GET भेजते हैं जिसमें हैश या अंतिम एक्सेस समय शामिल होता है। यदि कुछ बदल गया है तो सर्वर केवल एक पूर्ण पृष्ठ वापस भेजता है।
  3. एक समय में एक से अधिक UI पृष्ठ सर्वर से पुनर्प्राप्त करें। उदाहरण के लिए, यदि आपका UI 20 प्रविष्टियों को प्रदर्शित करता है, तो क्वेरी 60। मुझे इस एक का परीक्षण करने की आवश्यकता है, लेकिन मेरी उम्मीद यह है कि सबसे कुशल रिटर्न आकार आमतौर पर एक पृष्ठ पर दिखाए गए डेटा की औसत राशि से बड़ा होगा। यह कुछ पृष्ठ मोड़ के लिए UI को बहुत प्रतिक्रियाशील बनाता है।
  4. जब आप एक सीमा के पास होते हैं तो प्रीफ़ैच रिस्लेट करता है। यह उन तेज़ लोड समय को कैश से सुरक्षित रखने में मदद करता है।

2

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

वापसी कॉल में नए वर्तमान पृष्ठ के लिए सभी सामान्य डेटा शामिल होंगे, पहले से देखे गए पृष्ठों के लिए किसी भी पुराने अपडेट के लिए अपडेट। आप पुराने हैश का उपयोग कुंजी के रूप में कर सकते हैं।

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


आपके उत्तर के लिए धन्यवाद। मैं हैशिंग के बारे में सोच रहा था लेकिन यह सुनिश्चित नहीं था कि यह फिर से ऑर्डर करने वाले परिदृश्य के साथ मदद करेगा (यानी, यह पर्याप्त रूप से दानेदार नहीं है, और केवल-पृष्ठ पर संचालित होता है, प्रति-परिणाम के आधार पर नहीं)। मुझे लगता है कि आपका अंतिम पैराग्राफ एक अच्छा बिंदु है, और मैं यह सोचना शुरू कर रहा हूं कि किसी भी संभावित समाधान की जटिलता प्रदर्शन के लाभों से आगे निकल जाएगी।
वस्त्राभूषण
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.