2012-12-11 18 views
9

पर्यवेक्षकों और स्वीपर रेल से हटा दिए जाते हैं 4. कूल। लेकिन कैश को कैश करने और साफ़ करने का तरीका क्या है?बिना सफाई के रेल में कैश साफ़ करने का सही तरीका क्या है

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

उदाहरण के लिए:

<% cache @product do %> 
    Some HTML code here 
<% end %> 

आप अभी भी अपने cache_key पाने के लिए डाटाबेस से @product प्राप्त करने की आवश्यकता। अनावश्यक भार को रोकने के लिए पृष्ठ या एक्शन कैशिंग अभी भी उपयोगी हो सकती है।

मैं कभी-कभी कैश को साफ़ करने के लिए कुछ टाइमआउट का उपयोग कर सकता था लेकिन रिकॉर्ड के बदले में क्या होगा?

कम से कम स्वीपर के साथ आप उस पहलू पर नियंत्रण रखते हैं। सही कैश करने और इसे साफ़ करने के लिए क्या होगा/होगा?

धन्यवाद! :) कंप्यूटर विज्ञान में दो हार्ड समस्याओं में से एक के लिए

उत्तर

8

में आपका स्वागत है, कैश अमान्यकरण :)

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

आप Rails.cache.fetch विधि के लिए गोटो विधि है। Rails.cache.fetch 3 तर्क लेता है; कैश कुंजी, एक विकल्प हैश, और एक ब्लॉक। यह पहली बार कुंजी के आधार पर वैध कैश रिकॉर्ड पढ़ने की कोशिश करता है; यदि वह कुंजी मौजूद है और समाप्त नहीं हुई है तो यह कैश से मूल्य वापस कर देगी। यदि इसे वैध रिकॉर्ड नहीं मिल रहा है तो इसके बजाय ब्लॉक से वापसी मूल्य लेता है और इसे आपके निर्दिष्ट कुंजी के साथ कैश में संग्रहीत करता है।

उदाहरण के लिए:

@models = Rails.cache.fetch my_cache_key do 
    Model.where(condition: true).all 
end 

यह ब्लॉक कैश और परिणाम का पुन: उपयोग जब तक कुछ (टीएम) की अमान्य हो, ब्लॉक के लिए मजबूर कर पुनः मूल्यांकन के लिए होगा। विधि श्रृंखला के अंत में .all पर भी ध्यान दें। आम तौर पर रेल एक ActiveRecord संबंध ऑब्जेक्ट लौटाएंगे जिसे कैश किया जाएगा और फिर मूल्यांकन किया जाएगा जब आपने पहली बार @models का उपयोग करने की कोशिश की, तो कैश को अच्छी तरह से हटा दिया गया। .all रेल बलों को रिकॉर्ड लोड करने के लिए मजबूर करता है और यह सुनिश्चित करता है कि यह परिणाम है कि हम कैश करते हैं, सवाल नहीं।

तो अब जब आप अपने सभी कैश प्राप्त करते हैं और डेटाबेस से कभी बात नहीं करते हैं तो हमें यह सुनिश्चित करना होगा कि हम दूसरे छोर को कवर करते हैं, कैश को अमान्य कर देते हैं। यह Rails.cache.delete विधि के साथ किया जाता है जो केवल कैश कुंजी लेता है और इसे हटा देता है, अगली बार जब आप इसे लाने का प्रयास करते हैं तो उसे याद आती है। आप ब्लॉक के फिर से मूल्यांकन को मजबूर करने के लिए लाने के साथ force: true विकल्प का भी उपयोग कर सकते हैं। जो भी आपको सूट करता है।

इसका विज्ञान यह है कि Rails.cache.delete पर कॉल करने के लिए यह सब कुछ है, भले ही यह एक ही उदाहरण के लिए अपडेट और अपडेट, हटाएं, संग्रह के लिए किसी भी सदस्य को हटा दें। हमेशा मधुमक्खी के कोने के मामले होंगे और वे हमेशा आवेदन विशिष्ट होते हैं, इसलिए मैं आपको वहां बहुत मदद नहीं कर सकता।

मुझे इस जवाब में लगता है कि आप मेमकैच या रेडिस जैसे कुछ सेन कैश स्टोर सेट अप करेंगे।

इसके अलावा config/वातावरण/development.rb में जोड़ने के लिए याद रखें:

config.cache_store = :null_store 

या आप विकास के वातावरण को कैश होगा और आप हताशा से गंजा खत्म हो जाएगा।

आगे के संदर्भ के पढ़ने के लिए: Everyone should be using low level caching in Rails और The rails API docs

यह भी है कि कार्यक्षमता ध्यान देने योग्य है रेल 4 से हटा नहीं है, महज एक मणि में निकाला। यदि आपको स्वीपर की पूरी सुविधाएं चाहिए या चाहें तो इसे अपने जेमफाइल में gem 'rails-observers' लाइन के साथ अपने ऐप पर वापस जोड़ें। उस मणि में सफाई करने वाले और पर्यवेक्षकों दोनों शामिल हैं जहां रेल 4 कोर से हटा दिया गया था।

मुझे उम्मीद है कि आप शुरू कर देंगे।

+0

कैश अमान्यता के बारे में मुझे लगता है कि यह हमें स्वीपर भूमिका में वापस ले जाता है। मेरे नियंत्रक में 'Rails.cache.delete' को कॉल करने के बजाय मैं बाहरी मणि से स्वीपर का उपयोग कर सकता था। मुझे लगता है कि उस मामले में यह समझ में आता है, है ना? आपके उत्तर के लिए धन्यवाद :) – Happynoff

+0

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

+0

यही कारण है कि मुझे रेल 4 से सफाई करने वालों के बारे में अजीब लगता है। मुझे लगता है कि पृष्ठ/एक्शन कैशिंग खराब है, लेकिन निम्न स्तर के कैशिंग को अभी भी सफाई करने वालों या सफाई करने वालों की तरह व्यवहार की आवश्यकता है, इसलिए मुझे उन्हें हटाने का बिंदु नहीं दिख रहा है :( – Happynoff

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^