2015-07-17 5 views
6

रोकें कैशिंग और ऑटो द्वारा अवरुद्ध अनुरोध कर रहे हैं ग्राहकों के अनुरोध को अवरुद्ध कर देगा ताजा कैशरेल कैश, जबकि वे

पुनर्जीवित हम आसानी से रेल cache कर सकते हैं और सेट कि

Rails.cache.fetch(cache_key, expires_in: 1.minute) do 
    `fetch_data_from_mongoDB_with_complex_query` 
end 

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

जैसा कि अपेक्षित व्यवहार आरेख में दिखाया गया है, दूसरा अनुरोध cache 1 मिलेगा लेकिन cache 2 नहीं होगा, हालांकि रेल cache 2 के लिए बना रहा है। इसलिए, उपयोगकर्ता को नए कैश बनाने पर ज्यादा समय नहीं बिताना पड़ेगा। तो, उपयोगकर्ताओं को ट्रिगर करने के अनुरोध के बिना मैं सभी कैश को स्वचालित रूप से पुन: उत्पन्न कैसे कर सकता हूं?

अपेक्षित व्यवहार

कैश टुकड़ा

 cache_key = "#{__callee__}" 
    Rails.cache.fetch(cache_key, expires_in: 1.hour) do 
     all.order_by(updated_at: -1).limit(max_rtn_count) 
    end 

अद्यतन

मैं एक आदेश में सभी कैश की गई कुंजी कैसे मिल सकती है?

क्योंकि कैश की गई क्वेरी start_date, end_date, depature_at, arrive_at की संरचना द्वारा उत्पन्न किया जा सकता है।

मैन्युअल रूप से सभी कैश किए गए कुंजी को अमान्य करना संभव नहीं है।

कैसे मैं सभी कैश कुंजी है, तो रैक कार्य

+0

आप इसे (आसानी से) नहीं कर सकते हैं। ऐसा नहीं है कि रेल में कैशिंग कैसे काम करती है। आपको नए कैश उत्पन्न करने के लिए असीमित रूप से चलाने के लिए नौकरी को जुटाने की आवश्यकता होगी, और 'कैश' जैसी कुछ अंतर्निहित विधियों को ओवरराइट/संशोधित करें। – meagar

+1

आप कैशिंग क्या कर रहे हैं? क्या कैश कुंजियों का उपयोग करना संभव है जो केवल तभी अपडेट होते हैं जब आप अपडेट कैश कर रहे होते हैं (इस प्रकार धीमी प्रतिक्रिया के साथ समस्या को बाधित करते हैं)? –

उत्तर

2

में तो ताज़ा का प्रयोग expiration मुश्किल है के रूप में एक बार कैश की गई वस्तु को समाप्त हो रहा है, तो आप समाप्त हो गई मूल्य लाने के लिए सक्षम नहीं होगा मिल सकता है।

सबसे अच्छा अभ्यास अंतिम उपयोगकर्ता यातायात से आपकी कैश-रीफ्रेशिंग प्रक्रिया को कम करना होगा। आपको एक रेक कार्य की आवश्यकता होगी जो आपके कैश को पॉप्युलेट/रीफ्रेश करे और उस कार्य को क्रॉन के रूप में चलाएं। अगर किसी कारण से, नौकरी नहीं चलती है, तो कैश समाप्त हो जाएगा और आपके उपयोगकर्ताओं को डेटा लाने के लिए अतिरिक्त समय लगेगा।

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

वैकल्पिक रूप से, आप कैश की समाप्ति को अक्षम कर सकते हैं और यह निर्धारित करने के लिए एक अलग संकेतक (जैसे समय) का उपयोग कर सकते हैं कि कैश में ऑब्जेक्ट अद्यतित है या पुराना है या नहीं। यदि यह बासी है, तो आप कैश को अपडेट करने के लिए नौकरी कतार में एसिंक्रोनस ActiveJob कार्यकर्ता का उपयोग कर सकते हैं। बालों का डेटा उपयोगकर्ता को वापस कर दिया जाएगा और कैश पृष्ठभूमि में अपडेट किया जाएगा।

+0

हाय बहुत बहुत धन्यवाद, तो..क्या आपका मतलब है कि मैं अपने नियंत्रक में समाप्ति कोड भी डाल सकता हूं और 'Rails.cache.fetch (cache_key, expires_in: 1.hour) do' देख सकता हूं, और दूसरी ओर एक चल रहा है कैश को अमान्य करने के लिए रेक कार्य? क्या आप मुझे सरल उदाहरण दे सकते हैं या विचार कर सकते हैं कि डीबी से डेटा लाने के बाद कैश को कैसे अमान्य करना है? धन्यवाद – newBike

+1

नहीं, मेरे द्वारा सुझाए गए विकल्प इस प्रकार हैं: 1) कैश की समाप्ति सेट न करें और बैकएंड रेक कार्य ('Rails.cache.write ...') या 2 का उपयोग करके कैश को अपडेट करना जारी रखें) कैश की समाप्ति और उपयोग सेट न करें एक async कार्यकर्ता कैश को अद्यतन करने के लिए (sidekiq, आदि का उपयोग कर)। 'Cache.write' विधि का उपयोग वर्तमान ऑब्जेक्ट को ओवरराइट करेगा - अमान्यता की कोई आवश्यकता नहीं है। आपका रेक कार्य कैश को अपडेट/ओवरराइट करेगा, इसे अमान्य नहीं करेगा। समाप्ति का उपयोग करने का अर्थ है कि आप अपना ऑब्जेक्ट खो देंगे और कैश की समयसीमा समाप्त होने पर हर बार फिर से प्राप्त करेंगे। –

+0

हाय आपकी मदद के लिए धन्यवाद, बीटीडब्ल्यू मैं सभी कैश कुंजी को कमांड में कैसे प्राप्त कर सकता हूं? मैंने इसे अपडेट किया। मुझे लगता है कि मैं लगभग आपके जवाब से अपनी समस्या को ठीक करता हूं। – newBike

2

ऐसा लगता है कि कैशिंग को काम करने के लिए कैसे डिजाइन किया गया है। जब आपका अनुरोध आपके मामले में 1hr के बाद आता है, क्वेरी क्वेरी चलने के दौरान अनुरोध को फिर से चलाता है और ब्लॉक करता है।

रेलवे के लिए cache1 मूल रूप से समाप्त हो गया है, जबकि यह cache2 उत्पन्न करने पर काम कर रहा है।

लेकिन आप क्या पूछ रहे हैं इसके बारे में सोचें? आप इसे कुछ ऐसा करने के लिए कह रहे हैं जो समाप्त हो गया है? जब यह समाप्त हो गया है, तो रेल cache1 वापस कैसे लौट सकते हैं। ऐसा इसलिए हुआ क्योंकि आप स्पष्ट रूप से कैश को ठीक से 1 घंटे में समाप्त करने के लिए सेट करते हैं।

  1. अपने लंबे क्वेरी चलाएँ और अपनी कैश में वर्तमान टाइमस्टैम्प के साथ-साथ उसके परिणाम डाल:

    वहाँ प्राप्त करने के लिए आप क्या चाहते हैं, यहाँ एक समाधान है जो मन को तुरंत आता है कई मायनों हो सकता है। इस पर कोई समाप्ति मत डालो।

  2. उपरोक्त लंबी क्वेरी को फिर से चलाने और हर 1 घंटे कैश अपडेट करने के लिए पृष्ठभूमि कार्य को शेड्यूल करें। अद्यतन परमाणु बनाने की कोशिश करें।
  3. अब जब भी कोई ब्राउज़र अनुरोध आता है तो कैश में क्या होता है।
संबंधित मुद्दे