2009-02-22 7 views
70

मैं एक साधारण जावा इन-मेमोरी कैश की तलाश में हूं जिसमें अच्छी सहमति है (इसलिए लिंक्ड हैशैप पर्याप्त नहीं है), और जिसे समय-समय पर डिस्क पर क्रमबद्ध किया जा सकता है।सरल जावा इन-मेमोरी कैश की तलाश में

एक विशेषता जो मुझे चाहिए, लेकिन जो खोजने के लिए मुश्किल साबित हुई है, एक वस्तु पर "चोटी" का एक तरीका है। इसके द्वारा मेरा मतलब कैश से ऑब्जेक्ट को किसी ऑब्जेक्ट पर पकड़ने के बिना किसी ऑब्जेक्ट को पुनर्प्राप्त करने का मतलब है।

अद्यतन: एक अतिरिक्त आवश्यकता मैं उल्लेख करने की उपेक्षा है कि मैं कैश की गई वस्तुओं (वे नाव सरणियों होते हैं) यथा-स्थान को संशोधित करने में सक्षम होने की जरूरत है।

क्या कोई भी सिफारिशें प्रदान कर सकता है?

+1

मैं "प्रक्रिया के भीतर" कुछ इसी तरह है कि और हल्के वजन के लिए देख रहा हूँ:

public class Resource { @Cacheable(lifetime = 5, unit = TimeUnit.SECONDS) public String load(URL url) { return url.openConnection().getContent(); } } 

इसके अलावा, यह लेख पढ़ें। मैं ढेर में एक ग्रहण प्लगइन के भीतर कुछ डेटा स्टोर करने के लिए इसका उपयोग करना चाहता हूं। एहचेचे और जेसीएस मेरे स्वाद के लिए बहुत भारी वजन/वितरित/जे 2 ईई लगते हैं। – Uri

+1

[लाइटवेट जावा ऑब्जेक्ट कैश एपीआई] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/230649/lightweight-java-object-cache-api) – Raedwald

उत्तर

45

के बाद से इस सवाल का मूल रूप से कहा गया, Google's Guava library अब एक शक्तिशाली और लचीला कैश भी शामिल है। मैं इसका इस्तेमाल करने की सिफारिश करता हूं।

3

कैसे इस बारे में: https://commons.apache.org/proper/commons-jcs/ (नया पता करने के लिए अद्यतन, जेसीएस अपाचे कॉमन्स में है के रूप में)

+0

ऐसा लगता है कि @ सनीटी एक हल्का कैश चाहता था। – Rodolfo

34

Ehcache इस के लिए एक सुंदर अच्छा समाधान है और नज़र के लिए एक रास्ता (getQuiet() विधि है) इस तरह के यह है कि है निष्क्रिय टाइमस्टैम्प अपडेट नहीं करता है। आंतरिक रूप से, एशैच को नक्शे के एक सेट के साथ कार्यान्वित किया जाता है, जैसे कि ConcurrentHashMap, इसलिए इसमें समान प्रकार के समवर्ती लाभ होते हैं।

+2

धन्यवाद, एक अतिरिक्त प्रश्न: यदि मैं किसी ऑब्जेक्ट को EHcache (कहें, एक सरणी) से पुनर्प्राप्त करता हूं, और इसे संशोधित करता हूं - क्या ऑब्जेक्ट को कैश में अपडेट किया जाएगा? अर्थात। क्या EHCache ऑब्जेक्ट्स के संदर्भ बनाए रखता है? – sanity

+1

मुझे विश्वास है लेकिन यह सुरक्षित रूप से करने के लिए आपको ऑब्जेक्ट को उचित रूप से लॉक करना होगा। –

0

Ehcache आज़माएं? यह आपको अपने कैशिंग समाप्ति एल्गोरिदम में प्लग करने की अनुमति देता है ताकि आप अपनी चोटी की कार्यक्षमता को नियंत्रित कर सकें।

आप, डिस्क, डेटाबेस के लिए क्रमानुसार कर सकते हैं एक क्लस्टर आदि भर में ...

14

आप कुछ सरल की आवश्यकता होगी, कर रहे हैं, इस बिल फिट होगा?

Map<K, V> myCache = Collections.synchronizedMap(new WeakHashMap<K, V>()); 

यह अभ्यस्त डिस्क के लिए बचाने के लिए, लेकिन आप ने कहा कि आप साधारण चाहता था ...

लिंक:

(के रूप में एडम ने टिप्पणी की, किसी मानचित्र को सिंक्रनाइज़ करना एक प्रदर्शन हिट होता है। यह नहीं कह रहा कि इस विचार में मेरे बाल नहीं हैं टी, लेकिन एक त्वरित और गंदे समाधान के रूप में पर्याप्त होगा)

+2

एक संपूर्ण विशाल मानचित्र सिंक्रनाइज़ करना एक भारी जुर्माना है। आप आसानी से एक समवर्ती हैश मानचित्र में कमजोर प्रकारों को स्टोर कर सकते हैं और उन्हें समय-समय पर हटा सकते हैं। –

+3

ConcurrentHashMap Collections.synchronizedMap से बेहतर है http://stackoverflow.com/questions/6692008/java-concurrenthashmap-is-better-than-hashmap-performance-wise –

+6

प्रदर्शन-वार, ConcurrentHashMap बिल्कुल बेहतर प्रदर्शन करता है, लेकिन यह नहीं करता है कचरा कलेक्टर को स्मृति को पुनः प्राप्त करने की अनुमति देने के संबंध में एक WeakHashMap के गुण साझा करें। यह आपके लिए महत्वपूर्ण हो सकता है या नहीं भी हो सकता है। – Evan

9

इस प्रयास करें:।

import java.util.*; 

public class SimpleCacheManager { 

    private static SimpleCacheManager instance; 
    private static Object monitor = new Object(); 
    private Map<String, Object> cache = Collections.synchronizedMap(new HashMap<String, Object>()); 

    private SimpleCacheManager() { 
    } 

    public void put(String cacheKey, Object value) { 
     cache.put(cacheKey, value); 
    } 

    public Object get(String cacheKey) { 
     return cache.get(cacheKey); 
    } 

    public void clear(String cacheKey) { 
     cache.put(cacheKey, null); 
    } 

    public void clear() { 
     cache.clear(); 
    } 

    public static SimpleCacheManager getInstance() { 
     if (instance == null) { 
      synchronized (monitor) { 
       if (instance == null) { 
        instance = new SimpleCacheManager(); 
       } 
      } 
     } 
     return instance; 
    } 

} 
+0

सिंक्रनाइज़ किए गए मानचित्र पर भरोसा करने वाली समस्याएं पहले से ही अन्य उत्तरों में चर्चा की गई थीं। – sanity

+0

@sergeyB: मैं इसी तरह के समाधान की तलाश में था जो कैश को लागू करने के लिए आसान है ... धन्यवाद –

+0

'सार्वजनिक स्थैतिक SimpleCacheManager getInstance() {' 'सार्वजनिक सिंक्रनाइज़ किया गया स्थिर सरल कैश प्रबंधक प्राप्त करना चाहिए() {' अन्यथा 'अगर (उदाहरण == शून्य) {'धागा सुरक्षित नहीं है। सभी मामले में आप मॉनिटर ऑब्जेक्ट को एक साथ हटा सकते हैं क्योंकि सभी getInstance() कॉल के लिए सिंक्रनाइज़ेशन होता है, देखें: http://www.javaworld.com/article/2073352/core-java/simply-singleton.html?page= 2 –

9

आप आसानी से imcache का उपयोग कर सकते हैं। एक नमूना कोड नीचे है।

void example(){ 
    Cache<Integer,Integer> cache = CacheBuilder.heapCache(). 
    cacheLoader(new CacheLoader<Integer, Integer>() { 
     public Integer load(Integer key) { 
      return null; 
     } 
    }).capacity(10000).build(); 
} 
11

इन-मेमोरी जावा कैश के लिए एक और विकल्प cache2k है। इन-मेमोरी प्रदर्शन EHCache और Google guava से बेहतर है, cache2k benchmarks page देखें।

उपयोग पैटर्न अन्य कैश के समान है।आप तो अमरूद कैश बाहर की कोशिश कर रहा निर्भरता के रूप में गूगल अमरूद है, तो एक अच्छा विकल्प हो सकता है

Cache<String,String> cache = new Cache2kBuilder<String, String>() {} 
    .expireAfterWrite(5, TimeUnit.MINUTES) // expire/refresh after 5 minutes 
    .resilienceDuration(30, TimeUnit.SECONDS) // cope with at most 30 seconds 
              // outage before propagating 
              // exceptions 
    .refreshAhead(true)      // keep fresh when expiring 
    .loader(new CacheLoader<String, String>() { 
    @Override 
    public String load(final String key) throws Exception { 
     return ....; 
    } 
    }) 
    .build(); 
String val = cache.peek("something"); 
cache.put("something", "hello"); 
val = cache.get("something"); 

: यहाँ एक उदाहरण है।

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