Hafif Java Nesne önbellek API'si [kapalı]


99

Soru

Java bellek içi nesne önbelleğe alma API'si arıyorum. Herhangi bir tavsiye? Geçmişte hangi çözümleri kullandınız?

Güncel

Şu anda sadece bir Harita kullanıyorum:

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

Gereksinimler

Önbelleği aşağıdaki gibi temel özellikleri içerecek şekilde genişletmem gerekiyor:

  • Maksimum boyut
  • Yaşama zamanı

Ancak, şu gibi daha karmaşık özelliklere ihtiyacım yok:

  • Birden çok işlemden erişim (önbellek sunucusu)
  • Kalıcılık (diske)

Öneriler

Bellek İçi önbelleğe alma:

  • Guava CacheBuilder - aktif geliştirme. Bu sunuma bakın .
  • LRUMap - API aracılığıyla yapılandırma. TTL yok. Önbelleğe almak için özel olarak tasarlanmamıştır.
  • whirlycache - XML ​​yapılandırması. Mail listesi. Son güncelleme tarihi 2006.
  • cache4j - XML ​​yapılandırması. Rusça belgeler. Son güncelleme tarihi 2006.

Kurumsal önbelleğe alma:

  • JCS - Özellikler yapılandırması. Kapsamlı belgeler.
  • Ehcache - XML ​​yapılandırması. Kapsamlı belgeler. Google hitlerine göre en popüler olanı.

3
Guava Önbelleğini dahil etmek için Öneriler Bellek İçi önbelleğe alma bölümünü düzenleyebilir misiniz? Tıpkı sizin gibi hafif bir önbellekleme mekanizması arıyordum ve bu soruyu buldum, ancak Guava'yı bulamadım çünkü çok aşağı. Şimdi guava önbellek paketini kullanıyorum ve bu ŞAŞIRTICI.
andras

1
Bitti. :-) Beğenmene çok sevindim!
Kevin Bourrillion

Belki de nispeten yeni cache2k eklemeyi düşünmek istersiniz . Karşılaştırmalar sayfasında ehcache ve Guava'dan çok daha iyi performansa sahip olduğu söyleniyor.
user3001

Yanıtlar:


57

EHCache çok güzel. Bir bellek önbelleği oluşturabilirsiniz. Onların göz atın kod örnekleri önbellekte bir oluşturulmasına ilişkin bir örneği için. Maksimum boyut ve yaşam süresi belirleyebilirsiniz.

EHCache bazı gelişmiş özellikler sunar, ancak bunları kullanmakla ilgilenmiyorsanız, yapmayın. Ancak gereksinimleriniz değişirse orada olduklarını bilmek güzel.

İşte bir bellek içi önbellek. Yapılandırma dosyaları olmadan kodda oluşturulur.

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

200 öğe tutacak ve ttl'si 24 saatlik bir önbellek oluşturur.


2
EHCache yalnızca nesneye mi atıfta bulunuyor yoksa bunun yerine nesneyi seri hale getirip sonra da serisini kaldırıyor mu?
Phương Nguyenễn

2
EHCache ağır bir çözüm mü? Android'de bir API önbelleği uygulamak için mevcut önbelleğe alma çözümlerini araştırıyoruz.
Matthias

2
Android için çok ağır. Kitty önbelleğini kullanıyorum ve bu çok mükemmel!
Felipe

@Stevet K, bu Cache teknolojisini öğrenmekte geç kaldım, ancak sanırım getInstance () kaldırıldı veya değiştirildi.
Menai Ala Eddine - Aladdin

46

Gerçekten gibi MapMakerbirlikte geliyor Google Guava ( API )

JavaDoc, hem kullanım kolaylığını hem de gücünü gösteren oldukça düzgün bir örneğe sahiptir:

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

Dahası, Guava 10.0 sürümü çok daha kapsamlı com.google.common.cachepaketi tanıttı ( bunların nasıl kullanılacağına dair güzel bir wiki girişi var ).



@mxttie: teşekkürler, bağlantıyı ekledim, böyle eklemeler için bir düzenleme önermekten çekinmeyin.
Joachim Sauer

10

KittyCache adlı küçük önbellek kitaplığıma şu adresten de bakabilirsiniz:

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

Ehcache'ye karşı bazı performans karşılaştırmaları vardır.

Bu içinde kullanılan SimpleJPA ikinci seviye önbelleği olarak proje.


1
Güzel bir, ama keşke TTL'si varsa.
Rosdi Kasim

Teşekkürler ! birisinin zaten bir şey açıp
açmadığını

@RosdiKasim aslında put () çağrısında TTL'ye sahip, örneğin: cache.put ("anahtarım", değer, 500); 500, TTL'dir.
Travis Reeder

1
@TravisR Şey ..., o zamanlar TTL yoktu ..: p
Rosdi Kasim

Ahh, bu yorumun ne kadar zaman önce olduğunu anlamadım.
Travis Reeder

9

Üçüncü taraf kavanozlar olmadan basit bir önbellek uygulamak için LinkedHashMap'e göz atabilirsiniz:

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

o zaman önbellekten şu şekilde alabilirsiniz:

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

okuyucu için egzersiz olarak solda kalınız :)


2
Bu yöntemin TTL kapasitesi olduğunu düşünmüyorum. Yine de, kendi oyununuzu yuvarlamak için iyi bir başlangıç ​​olacaktır.
Chase Seibert

Evet, okuyucu alıştırmasının bir parçası olarak TTL'yi bırakacağım: p - ve tabii ki üçüncü taraf kitaplıklar, kendi kitaplarınızı sürmekten çok daha fazla test edilmiş olacak.
JeeBee


5

JCS denenmiş ve doğrudur. Önbellekleme mekanizmaları kadar hafif olsa da, gerçek koda girebilir ve kapakların altındaki HashMap ile yaptıklarını tam olarak ihtiyacınız olana taklit edebilirsiniz. Ne aradığına dair oldukça iyi bir fikrin var gibi görünüyor.


Önbelleğe alma mekanizmaları gittiği sürece bunun hafif olmadığınısöylüyorsunuz ? Yine de en popüler kurumsal çözümlerden biri gibi görünüyor.
Chase Seibert

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.