2012-05-04 8 views
21

मैं रेल 3.1 एप के लिए हेरोकू के साथ मेमकैच का उपयोग कर रहा हूं। मेरे पास एक बग था और गलत चीजें दिख रही हैं - पैरामीटर कैश के लिए गलत थे।रेल में मैन्युअल रूप से साफ़ फ्रैगमेंट कैश

<% cache("foo_header_cache_#{@user.id}") do %> 

मैं टुकड़ा कैशिंग हटा दिया और Heroku को धक्का दिया और बुरा डेटा दूर चला गया:

मैं इस किया था।

<% cache("foo_header_cache_#{@foo.id}") do %> 

हालांकि, जब मैं मानकों को सही, @user @foo करने से, वर्ष [गलत] कैश्ड संस्करण फिर बजाय सही डेटा के साथ ताज़ा करने के पता चला है (:

और फिर मैं यह करने के लिए बदल)।

मैं मैन्युअल रूप से इसे कैसे समाप्त कर सकता हूं, या अन्यथा दिखाए जा रहे इस खराब डेटा से छुटकारा पा सकता हूं?

उत्तर

39

मैं मैन्युअल रूप से रेल कंसोल में जा रहा है और आदेश का उपयोग करके पूरे कैश को साफ़ करने समाप्त हो गया:

Rails.cache.clear 
+3

जॉन कोलोयन का उत्तर आपको एक टुकड़े की समाप्ति करने की अनुमति देता है। यदि आपके पास ऐसी साइट है जो उचित मात्रा में यातायात प्राप्त करती है और कैशिंग पर निर्भर करती है, तो सबकुछ समाप्त होने से कैश गर्म होने के कारण बहुत धीमी पृष्ठ लोड या टाइमआउट त्रुटियां हो सकती हैं। –

20

रेल कंसोल से:

Rails.cache.delete 'FRAGMENT-NAME' 
+4

अब यह सही उत्तर है। स्वीकार्य एक फ्लाई को मारने के लिए एक शॉटगन का उपयोग कर रहा है। –

7

कंसोल से:

आप इस (यानी चला सकते हैं। यदि आप जानते हैं आईडी '1' है)

ActionController::Base.new.expire_fragment("foo_header_cache_1") 

Rails.cache.delete उपयोग करने के लिए आप टुकड़ा नाम जानना चाहते हैं। आपके मामले में, यह होगा

Rails.cache.delete("views/foo_header_cache_1") # Just add 'views/' to the front of the string 

आप एक सरणी आधारित कैश जैसे वस्तुओं, का उपयोग कर कुंजी है:

cache([:foo_header_cache, @user]) 

तो फिर तुम तो

ActionController::Base.new.fragment_cache_key([:foo_header_cache, @user]) 
तरह टुकड़ा नाम प्राप्त कर सकते हैं

नाम में id और updated_at किसी भी ऑब्जेक्ट (yyyymmddhhmmss) से समय शामिल है। यह कुछ "विचार/foo_header_cache/उपयोगकर्ता/1-20160901021000"

या सरणी का उपयोग करके इसे साफ़ करें।

ActionController::Base.new.expire_fragment([:foo_header_cache, @user])