में आपका स्वागत है, कैश अमान्यकरण :)
आप जब एक कैश्ड वस्तु, एक कैश्ड दृश्य के विपरीत बस हो सकता है, जिसके लिए तर्क के बाद से है कि मैन्युअल रूप से संभाल करने के लिए होता है प्रदर्शित वस्तुओं से व्युत्पन्न, अमान्य होना चाहिए आवेदन और स्थिति निर्भर है।
आप 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 कोर से हटा दिया गया था।
मुझे उम्मीद है कि आप शुरू कर देंगे।
कैश अमान्यता के बारे में मुझे लगता है कि यह हमें स्वीपर भूमिका में वापस ले जाता है। मेरे नियंत्रक में 'Rails.cache.delete' को कॉल करने के बजाय मैं बाहरी मणि से स्वीपर का उपयोग कर सकता था। मुझे लगता है कि उस मामले में यह समझ में आता है, है ना? आपके उत्तर के लिए धन्यवाद :) – Happynoff
हां, स्वीपर की भूमिका से बाहर निकलना मुश्किल है क्योंकि यह एक काम करने वाली कैश रणनीति के लिए एक शर्त है;) आमतौर पर कैश अमान्यता, संदेश और सामान जैसी चीजों के लिए जीवन चक्र वर्ग होता है। बाहरी मॉडल के साथ बातचीत। इस तरह आपके पास एक क्लीन कंट्रोलर, छोटे कोर क्लास है और बेस क्लास को सुनते हुए किसी अन्य वर्ग में अपने अपर्याप्त व्यवहार को चिपकाएं। संक्षेप में स्वीपर इन जीवन चक्र वर्गों में से एक का एक विशेष मामला है और रणनीति के रूप में उनके साथ स्वाभाविक रूप से गलत कुछ भी नहीं है। –
यही कारण है कि मुझे रेल 4 से सफाई करने वालों के बारे में अजीब लगता है। मुझे लगता है कि पृष्ठ/एक्शन कैशिंग खराब है, लेकिन निम्न स्तर के कैशिंग को अभी भी सफाई करने वालों या सफाई करने वालों की तरह व्यवहार की आवश्यकता है, इसलिए मुझे उन्हें हटाने का बिंदु नहीं दिख रहा है :( – Happynoff