2010-09-17 10 views
8

मैं अभी इस answer in SO पर आया हूं जहां यह उल्लेख किया गया है कि Google संग्रह MapMaker बहुत बढ़िया है। मैं प्रलेखन के माध्यम से गया लेकिन वास्तव में यह पता नहीं लगा सका कि मैं इसका उपयोग कैसे कर सकता हूं। क्या किसी भी परिदृश्य में यह पता चलता है कि यह कहां होगा MapMaker का उपयोग करने के लिए उपयुक्त है।Google संग्रह का उपयोग MapMaker?

+0

देखें: http://stackoverflow.com/questions/3617680/can-someone-explain-to-me-when-it-is-useful-to-use-mapmaker-or-weakhashmaps – ColinD

उत्तर

12

यहाँ एक ही रास्ता है की एक त्वरित नमूना मैं MapMaker का उपयोग किया है है इसे सर्वर से पुनर्प्राप्त कर देगा, इसे कैश करेगा, और इसे वापस कर देगा। मुझे इसके बारे में सोचना नहीं है कि इसे स्थापित करने के बाद। इसके अलावा, चूंकि मैंने सेट किया है, इसलिए कैश भर नहीं सकता है और स्मृति समस्याओं का कारण बन सकता है क्योंकि सिस्टम स्मृति आवश्यकताओं के जवाब में इससे प्रविष्टियों को साफ़ करने में सक्षम है। यदि मानचित्र से कैश किए गए मान को साफ़ किया गया है, हालांकि, अगली बार इसकी आवश्यकता होने पर यह सर्वर से फिर से पूछ सकता है!

बात यह है कि यह केवल एक ही तरीका है जिसका उपयोग किया जा सकता है। मानचित्र को मजबूत, कमजोर या मुलायम कुंजी और/या मानों का उपयोग करने का विकल्प, साथ ही विशिष्ट समय के बाद प्रविष्टियों को निकालने का विकल्प, आपको इसके साथ बहुत सारी चीज़ें करने देता है।

+0

'getFoo' होना चाहिए और 'getFooFromServer' यहां एक ही कार्य हो? –

+0

@ टॉम: नहीं, क्योंकि जब 'fooCache.get (id)' कहा जाता है, तो गणना कैश में नहीं होने पर कंप्यूटिंग मानचित्र का 'फ़ंक्शन' कहा जाएगा। यदि 'फ़ंक्शन' को फिर से 'getFoo'' कहा जाता है, तो यह एक बार फिर 'fooCache.get' को कॉल करने का प्रयास करेगा। उस ने कहा, 'getFooFromServer()' के लिए कोड को एक अलग विधि के बजाय 'फंक्शन' के अंदर सही रूप से परिभाषित किया जा सकता है ... मैंने अभी यह स्पष्ट करने के लिए एक नामित विधि का उपयोग किया है कि फ़ंक्शन बिना किसी वास्तविक नकली को लिखने के क्या करता है सर्वर को कॉल करने के लिए कोड। – ColinD

3

यदि आप SoftReference और WeakReference के विवरणों को देखते हैं तो यह आपकी सहायता कर सकता है।

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

WeakReference कचरा कलेक्टर को बताता है कि यह तब तक संदर्भित वस्तु को एकत्र कर सकता है जब तक कि इसके कहीं और कोई मजबूत संदर्भ न हो। यह आम तौर पर उन चीजों के साथ प्रयोग किया जाता है जिन्हें तुरंत आवश्यकतानुसार देखा जा सकता है।

तो, कैश के लिए softValues ​​के साथ एक ConcurrentMap बनाने के लिए MapMaker का उपयोग करने पर विचार करें, और अस्थायी लुकअप टेबल के लिए कमजोर के साथ एक।

संपादित करें: softValues ​​एक एलआरयू नीति का उपयोग करता है।

private final ConcurrentMap<Long, Foo> fooCache = new MapMaker() 
    .softValues() 
    .makeComputingMap(new Function<Long, Foo>() { 
      public Foo apply(Long id) { 
      return getFooFromServer(id); 
      } 
     }); 

public Foo getFoo(Long id) { 
    return fooCache.get(id); 
} 

get(id) नक्शे पर कहा जाता है, यह या तो Foo कि आईडी या यह 'के लिए नक्शे में है कि वापसी करेंगे:

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