हल्के जावा ऑब्जेक्ट कैश एपीआई [बंद]


99

सवाल

मैं एक जावा इन-मेमोरी ऑब्जेक्ट कैशिंग एपीआई की तलाश कर रहा हूं। कोई सिफारिशें? आपने अतीत में किन समाधानों का उपयोग किया है?

वर्तमान

अभी, मैं सिर्फ एक मानचित्र का उपयोग कर रहा हूं:

Map cache = new HashMap<String, Object>();
cache.put("key", value);

आवश्यकताएँ

मुझे मूलभूत सुविधाओं को शामिल करने के लिए कैश का विस्तार करने की आवश्यकता है:

  • अधिकतम आकार
  • जीने के लिए समय

हालाँकि, मुझे और अधिक परिष्कृत सुविधाओं की आवश्यकता नहीं है:

  • कई प्रक्रियाओं से एक्सेस (कैशिंग सर्वर)
  • दृढ़ता (डिस्क के लिए)

सुझाव

इन-मेमोरी कैशिंग:

  • अमरूद कैशेबर्स्ट - सक्रिय विकास। इस प्रस्तुति को देखें ।
  • LRUMap - एपीआई के माध्यम से कॉन्फ़िगर करें। कोई टीटीएल नहीं। कैशिंग के लिए बनाया गया उद्देश्य नहीं।
  • whirlycache - XML ​​config। मेलिंग सूची। अंतिम बार 2006 में अद्यतन किया गया।
  • cache4j - XML ​​कॉन्फ़िगरेशन। रूसी में प्रलेखन। अंतिम बार 2006 में अद्यतन किया गया।

एंटरप्राइज कैशिंग:

  • जेसीएस - गुण विन्यास। व्यापक प्रलेखन।
  • Ehcache - XML ​​config। व्यापक प्रलेखन। Google हिट के अनुसार अब तक सबसे लोकप्रिय है।

3
क्या आप अमरूद कैश को शामिल करने के लिए सुझाव-स्मृति कैशिंग अनुभाग को संपादित कर सकते हैं? मैं आप की तरह एक हल्के कैशिंग तंत्र की तलाश कर रहा था, और यह प्रश्न पाया, लेकिन अमरूद नहीं मिला क्योंकि यह नीचे है। अब मैं अमरूद कैश पैकेज का उपयोग करता हूं, और यह अद्भुत है।
andras

1
किया हुआ। :-) आपको बहुत पसंद है!
केविन बोर्रिलिन

हो सकता है कि आप अपेक्षाकृत नए cache2k को जोड़ने पर भी विचार करना चाहते हों । उनके बेंचमार्क पेज पर यह कहा जाता है कि यह ehcache और Guava की तुलना में बेहतर प्रदर्शन है।
user3001

जवाबों:


57

EHCache बहुत अच्छा है। आप मेमोरी कैश में एक बना सकते हैं। मेमोरी कैश बनाने के उदाहरण के लिए उनके कोड नमूने देखें । आप अधिकतम आकार, और रहने का समय निर्दिष्ट कर सकते हैं।

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

यहाँ एक मेमोरी कैश में है। कोई कॉन्फ़िगरेशन फ़ाइलों के साथ कोड में बनाया गया।

CacheManager cacheManager = CacheManager.getInstance();
int oneDay = 24 * 60 * 60;
Cache memoryOnlyCache = new Cache("name", 200, false, false, oneDay, oneDay);
cacheManager.addCache(memoryOnlyCache);

एक कैश बनाता है जो 200 तत्वों को रखेगा, और 24 घंटे का एक ttl होगा।


2
क्या EHCache सिर्फ ऑब्जेक्ट को संदर्भित करता है या यह क्रमबद्ध करता है और फिर इसके बजाय ऑब्जेक्ट को डिसेरलाइज़ करता है?
न्गुयेन

2
EHCache एक हेवीवेट समाधान है? हम एंड्रॉइड पर एपीआई कैश को लागू करने के लिए मौजूदा कैशिंग समाधानों में देख रहे हैं।
मथायस

2
यह Android के लिए बहुत भारी है। मैं किट्टी कैश का उपयोग कर रहा हूँ और यह बहुत सही है!
फेलिप

@ स्तेवेट के, मुझे इस कैश तकनीक को जानने में देर हो गई है, लेकिन मुझे लगता है कि getInstance () को हटा दिया गया था या बदल दिया गया था।
मेनाई अला एडडिन - अलादीन

46

मुझे वास्तव में यह पसंद है MapMakerकि Google अमरूद ( एपीआई ) के साथ आता है

JavaDoc का एक बहुत साफ उदाहरण है जो इसकी उपयोग की आसानी और शक्ति दोनों को प्रदर्शित करता है:

ConcurrentMap<Key, Graph> graphs = new MapMaker()
   .concurrencyLevel(32)
   .softKeys()
   .weakValues()
   .expiration(30, TimeUnit.MINUTES)
   .makeComputingMap(
       new Function<Key, Graph>() {
         public Graph apply(Key key) {
           return createExpensiveGraph(key);
         }
       });

इसके अलावा, अमरूद के रिलीज़ 10.0 ने और अधिक व्यापक com.google.common.cacheपैकेज पेश किया (इसमें उनका उपयोग करने के तरीके पर एक अच्छी विकि प्रविष्टि है )।



@mxttie: धन्यवाद, मैंने लिंक जोड़ दिया है, इस तरह के परिवर्धन के लिए संपादन का सुझाव देने के लिए स्वतंत्र महसूस करें।
जोआचिम सॉउर

10

आप किट्टीचेच नामक मेरी छोटी कैश लाइब्रेरी को भी देख सकते हैं:

https://github.com/treeder/kitty-cache

कुछ प्रदर्शन बेंचमार्क बनाम ehcache हैं।

यह SimpleJPA परियोजना में दूसरे स्तर के कैश के रूप में उपयोग किया जाता है ।


1
एक अच्छा है, लेकिन अगर यह केवल TTL है।
रोजी कासिम

धन्यवाद ! अगर मैं किसी को पहले से ही कुछ
खट्टा

@RosdiKasim में TTL वास्तव में पुट पर है () कॉल, जैसे: cache.put ("mykey", value, 500); 500 टीटीएल है।
ट्रैविस रीडर

1
@TravisR खैर ..., इसके बाद टीटीएल वापस नहीं आया: पी
रोजी कासिम

आह, पता नहीं कितनी देर पहले वह टिप्पणी थी।
ट्रैविस रीडर

9

आप तीसरे पक्ष के जार के बिना एक साधारण कैश को लागू करने के लिए लिंक्डहैश मैप देख सकते हैं:

    Map <String, Foo> cache = new LinkedHashMap<String, Foo>(MAX_ENTRIES + 1, .75F, true) {

        public boolean removeEldestEntry(Map.Entry<String, Foo> eldest) {
            return size() > MAX_ENTRIES;
        }
    };

तो आप कैश से प्राप्त कर सकते हैं

    Foo foo = cache.get(key);
    if (foo == null && !cache.containsKey(key)) {
        try {
            FooDAO fooDAO = DAOFactory.getFooDAO(conn);
            foo = fooDAO.getFooByKey(key);
            cache.put(key, foo);
        } catch (SQLException sqle) {
            logger.error("[getFoo] SQL Exception when accessing Foo", sqle);
        }
    }

पाठक के लिए व्यायाम के रूप में बाकी छोड़ दिया :)


2
मुझे नहीं लगता कि इस विधि में टीटीएल क्षमता है। यह अपने आप को रोल करने की एक अच्छी शुरुआत होगी, हालांकि।
चेस सीबेरट

हाँ, मैं पाठक अभ्यास के हिस्से के रूप में टीटीएल सामान छोड़ दूँगा: पी - और निश्चित रूप से तीसरे पक्ष के कामों को आपके स्वयं के रोल करने से कहीं अधिक परीक्षण किया गया होगा।
JeeBee


5

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


मेरा मानना ​​है कि जहां तक ​​कैचिंग मैकेनिज्म की बात है तो यह हल्का नहीं है ? यह सबसे लोकप्रिय उद्यम समाधानों में से एक लगता है, हालाँकि।
चेस सीबेरट

3

मेम के पास जावा के लिए क्लाइंट है। http://www.danga.com/memcached/ को कैशिंग सर्वर बनने के लिए अलग प्रक्रिया की आवश्यकता होती है, लेकिन शक्तिशाली चीज।

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