2011-10-26 3 views
11

मैं 2 कैश का उपयोग करना चाहता हूं - स्मृति में डिफ़ॉल्ट एक और एक memcache एक, हालांकि अमूर्त रूप से इससे कोई फर्क नहीं पड़ता (मुझे लगता है) जो दो।रेल में एकाधिक कैश का उपयोग कैसे करें? (असली के लिए)

स्मृति डिफ़ॉल्ट म वह जगह है जहाँ मैं छोटे और शायद ही कभी बदलते डेटा लोड करना चाहते हैं। मैं एक तारीख को स्मृति का उपयोग कर रहा हूं। मैं वहां डेटाबेस से 'डोमेन डेटा' प्रकार की सामग्री का एक गुच्छा रखता हूं, मेरे पास बाहरी स्रोतों से कुछ छोटा डेटा भी है जो मैं हर 15 मिनट -1 घंटे ताज़ा करता हूं।

क्योंकि मैं अब कुछ बड़े संपत्ति की सेवा कर रहा हूँ मैं हाल ही में मेम्कैश गयी। परिसर का क्रमबद्ध करें कि मैं इसमें कैसे मिला, लेकिन ये बड़े ~ किलोबाइट्स हैं, अपेक्षाकृत कम मात्रा में (सैकड़ों), और अत्यधिक कैशबल - वे बदलते हैं, लेकिन प्रति घंटा एक बार ताज़ा करना बहुत अधिक है। यह सेट बढ़ सकता है, लेकिन यह सभी होस्टों में साझा किया जाता है। ताज़ा महंगा है।

डेटा का पहला सेट अब थोड़ी देर के लिए डिफ़ॉल्ट कैश मेमोरी का उपयोग कर रहा है, और अच्छी तरह से व्यवहार किया गया है। Memcache डेटा के दूसरे सेट के लिए एकदम सही है।

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

तो, मैं 2 कैश का उपयोग करना चाहते। विचार?

(नोट: मेरे सर्वर की तुलना में विभिन्न मशीनों पर memcache चल रहा है। यहां तक ​​कि अगर मैं इसे स्थानीय रूप से चलाता हूं, तो मेरे पास मेजबान का बेड़ा है, इसलिए यह सभी के लिए स्थानीय नहीं होगा। इसके अलावा, मैं ज़रूरत से बचना चाहता हूं बड़ी मशीनें प्राप्त करने के लिए। हालांकि मैं स्मृति को बड़ा बनाकर और केवल स्मृति में उपयोग करके इस समस्या को हल कर सकता हूं (डेटा वास्तव में इतना बड़ा नहीं है), यह समस्या को हल नहीं करता है क्योंकि मैं स्केल करता हूं, इसलिए यह बस कर सकते हैं लात जा।)

उत्तर

15

ActiveSupport :: कैश :: MemoryStore क्या आप उपयोग करना चाहते है। Rails.cache या तो मेमोरीस्टोर, फाइलस्टोर या मेरे मामले में डेलिस्टोर का उपयोग करता है :-)

आपके पास ActiveSupport :: कैश :: मेमोरीस्टोर का वैश्विक उदाहरण हो सकता है और इसका उपयोग कर सकते हैं या इस ऑब्जेक्ट को रखने वाले सिंगलटन पैटर्न के साथ कक्षा बना सकते हैं (क्लीनर)।

Caching::MemoryCache.instance.write("foo", "bar") 
=> true 
Caching::MemoryCache.instance.read("foo") 
=> "bar" 
Caching::MemoryCache.instance.clear 
=> 0 
Caching::MemoryCache.instance.read("foo") 
=> nil 
Caching::MemoryCache.instance.write("foo1", "bar1") 
=> true 
Caching::MemoryCache.instance.write("foo2", "bar2") 
=> true 
Caching::MemoryCache.instance.read_multi("foo1", "foo2") 
=> {"foo1"=>"bar1", "foo2"=>"bar2"} 
6

एक प्रारंभकर्ता आप कर सकते हैं में:

module Caching 
    class MemoryCache 
     include Singleton 

     # create a private instance of MemoryStore 
     def initialize 
     @memory_store = ActiveSupport::Cache::MemoryStore.new 
     end 

     # this will allow our MemoryCache to be called just like Rails.cache 
     # every method passed to it will be passed to our MemoryStore 
     def method_missing(m, *args, &block) 
     @memory_store.send(m, *args, &block) 
     end 
    end 
end 

यह है कि यह कैसे उपयोग करने के लिए है: अन्य कैश की दुकान में Rails.cache निर्धारित करें और MemoryStore

के लिए इस सिंगलटन का उपयोग

नीचे इस वर्ग है बस डाल:

MyMemoryCache = ActiveSupport :: कैश :: MemoryStore.new

फिर आप इसे इस तरह उपयोग कर सकते हैं:

MyMemoryCache.fetch('my-key', 'my-value') 

और इसी तरह।

ध्यान दें कि यदि यह सिर्फ प्रदर्शन के अनुकूलन के लिए है (और समय समाप्ति पर निर्भर करता है), यह एक बुरा विचार अपने परीक्षण वातावरण में उसे निष्क्रिय करने के लिए नहीं हो सकता है, इस प्रकार है:

if Rails.env.test? 
    MyMemoryCache = ActiveSupport::Cache::NullStore.new 
else 
    MyMemoryCache = ActiveSupport::Cache::MemoryStore.new 
end 

रेल पहले से ही द्वारा इस प्रदान करता है आपको अपने पर्यावरण प्रारंभकर्ताओं में विभिन्न मान config.cache_store सेट करने की अनुमति देता है।

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