सरल जावा-इन-मेमोरी कैश की तलाश [बंद]


102

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

एक विशेषता जिसकी मुझे आवश्यकता है, लेकिन जिसे ढूंढना कठिन साबित हुआ है, एक वस्तु पर "झांकना" है। इसका मतलब है कि मैं कैश से किसी वस्तु को पुनः प्राप्त करता हूं, जिससे कैश को वस्तु से अलग रखा जा सकता है, अन्यथा उसके पास नहीं है।

अद्यतन: एक अतिरिक्त आवश्यकता जिसका मैंने उल्लेख करने के लिए उपेक्षा की है कि मुझे जगह में कैश्ड वस्तुओं (वे फ्लोट एरेज़ शामिल हैं) को संशोधित करने में सक्षम होने की आवश्यकता है।

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


1
मैं कुछ इसी तरह की तलाश कर रहा हूं जो "प्रक्रिया के भीतर" और हल्का वजन है। मैं इसे ढेर में एक ग्रहण प्लगइन के भीतर कुछ डेटा स्टोर करने के लिए उपयोग करना चाहता हूं। Ehcache और JCS मेरे स्वाद के लिए बहुत भारी / वितरित / J2EE लगती हैं।
उरई


मैं अपाचे इग्नाइट ( ignite.apache.org ) की सिफारिश करूंगा
भगत एस।

1
यह प्रश्न बंद है (तथ्य के 6 साल बाद) और यह अभी भी कुछ लोग सोच रहे हैं कि आज, एसओ का मॉडरेटर सिस्टम कैसे विफल हो रहा है।
डस्टीवन

जवाबों:


61

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


3
कृपया ध्यान दें कि वसंत अब गुवा कैश का समर्थन नहीं करता है: stackoverflow.com/questions/44175085/…
पापी

@ दान यह Jcache को लागू करता है?
गौरव

कैफीन भी अच्छा और अच्छा प्रदर्शन करने वाला पुस्तकालय है। कैफीन एक उच्च प्रदर्शन है, जो जावा 8 पर आधारित इष्टतम कैशिंग लाइब्रेरी के पास है। कैफीन एक Google Guava प्रेरित एपीआई का उपयोग करके इन-मेमोरी कैश प्रदान करता है
स्लावस

37

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


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

1
मेरा मानना ​​है कि लेकिन ऐसा करने के लिए आपको सुरक्षित रूप से ऑब्जेक्ट को लॉक करना होगा, बिल्कुल।
एलेक्स मिलर

मुझे एहसे प्यार है, हालाँकि, यह एक 10mb जार है। बहुत बड़ा।
चिह्न

23

यदि आपको कुछ सरल चाहिए, तो क्या यह बिल फिट होगा?

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

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

लिंक:

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


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

7
ConcurrentHashMap, Collections.synchronizedMap stackoverflow.com/questions/6692008/…
पाब्लो मोरेटी

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

4
फिर उपयोग करें ConcurrentHashMap<WeakReference<T>>docs.oracle.com/javase/7/docs/api/java/lang/ref/…
jdmichal

19

इन-मेमोरी जावा कैश के लिए एक अन्य विकल्प cache2k है । इन-मेमोरी प्रदर्शन EHCache और Google अमरूद से बेहतर है, कैश 2k बेंचमार्क पेज देखें

उपयोग पैटर्न अन्य कैश के समान है। यहाँ एक उदाहरण है:

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");

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


cruftex, अगर मैं अपना आवेदन बंद कर दूं तो कैश सभी रजिस्टर्ड डेटा को नष्ट कर देगा या नहीं?
मेनाई अला एड्डिन - अलादीन

10

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

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

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;
    }

}

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

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

1
public static SimpleCacheManager getInstance() {public synchronized static SimpleCacheManager getInstance() {अन्यथा if (instance == null) {थ्रेड सुरक्षित नहीं होना चाहिए । जिस स्थिति में आप मॉनिटर ऑब्जेक्ट को सभी को एक साथ हटा सकते हैं क्योंकि सभी getInstance () कॉल के लिए सिंक्रोनाइज़ेशन हो जाता है, देखें: javaworld.com/article/2073352/core-java/…
Can Kavaklıoğan

क्या मैं सिंगलटन के लिए एनम का उपयोग करने की सलाह दे सकता हूं? dzone.com/articles/java-singletons-use-enum
Erk

9

जेसीबी-पहलुओं@Cacheable से कोशिश करें । एक एकल एनोटेशन के साथ आप पूरी विधि परिणाम को स्मृति में जाने योग्य बनाते हैं:

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

इसके अलावा, इस लेख को पढ़ें: http://www.yegor256.com/2014/08/03/cacheable-java-annotation.html



0

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.