Basit Java bellek içi önbelleği aranıyor [kapalı]


102

İyi eşzamanlılığa sahip (bu yüzden LinkedHashMap yeterince iyi değil) ve periyodik olarak diske serileştirilebilen basit bir Java bellek içi önbellek arıyorum.

İhtiyacım olan, ancak bulunması zor olan bir özellik, bir nesneye "göz atmanın" bir yoludur. Bununla, önbelleğin nesneyi başka türlü yapabileceğinden daha uzun süre tutmasına neden olmadan önbellekten bir nesneyi almayı kastediyorum.

Güncelleme: Bahsetmeyi ihmal ettiğim ek bir gereksinim, önbelleğe alınmış nesneleri (float dizileri içerirler) yerinde değiştirebilmem gerektiğidir.

Herhangi bir öneride bulunan var mı?


1
"Süreç içinde" ve daha hafif olan benzer bir şey arıyorum. Bir Eclipse eklentisi içindeki bazı verileri yığın içinde depolamak için kullanmak istiyorum. Ehcache ve JCS, bana göre çok ağır / dağıtılmış / J2EE görünüyor.
Uri



1
Bu sorunun (gerçeğin üzerinden 6 yıl sonra) kapalı olması ve bugün hala insanların merak ettiği bir şey, SO'nun moderatör sisteminin nasıl başarısız olduğunu gösteriyor.
dustinevan

Yanıtlar:


62

Bu soru ilk sorulduğundan beri, Google'ın Guava kitaplığı artık güçlü ve esnek bir önbellek içeriyor. Bunu kullanmanızı tavsiye ederim.


3
Spring'in artık Guava önbelleğini desteklemediğini lütfen unutmayın: stackoverflow.com/questions/44175085/…
günahkar

@sanity Jcache uyguluyor mu?
Gaurav

Caffine ayrıca güzel ve performanslı bir önbelleğe alma kitaplığıdır. Kafein, Java 8 tabanlı optimum önbelleğe alma kitaplığına yakın, yüksek performanslı bir önbellek kitaplığıdır. Caffeine, Google
Guava'dan

38

Ehcache bunun için oldukça iyi bir çözümdür ve boşta kalma zaman damgasını güncellemeyecek şekilde gözetleme ( getQuiet () yöntemdir). Dahili olarak Ehcache, ConcurrentHashMap gibi bir dizi haritayla uygulanır, bu nedenle benzer türde eşzamanlılık avantajları vardır.


2
Teşekkürler, ek bir soru: EHcache'den (örneğin bir dizi) bir nesne alırsam ve onu değiştirirsem - nesne önbellekte güncellenir mi? yani. EHCache nesnelere referans veriyor mu?
sanity

1
Öyle sanıyorum ama bunu güvenli bir şekilde yapmak için elbette nesneyi uygun şekilde kilitlemelisiniz.
Alex Miller

Ehcache'yi seviyorum, ancak 10mb'lik bir kavanoz. Çok büyük.
markthegrea

24

Basit bir şeye ihtiyacınız varsa, bu faturaya uyuyor mu?

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

Diske kaydedilmeyecek, ama basit istediğini söyledin ...

Bağlantılar:

(Adam'ın da dediği gibi, bir haritayı senkronize etmenin performans açısından bir etkisi vardır. Fikrin üzerinde tüyler olmadığını söylememek, ancak hızlı ve kirli bir çözüm olarak yeterli olacaktır.)


4
Devasa bir haritanın tamamını senkronize etmek ağır bir cezadır. Zayıf türleri eşzamanlı bir hash haritasında kolayca saklayabilir ve düzenli aralıklarla kaldırabilirsiniz.
Adam Gent

7
ConcurrentHashMap, Collections.synchronizedMap stackoverflow.com/questions/6692008/…
Pablo Moretti

8
Performans açısından ConcurrentHashMap kesinlikle daha iyi performans gösterir, ancak çöp toplayıcının belleği geri kazanmasına izin verme açısından WeakHashMap'in özelliklerini paylaşmaz. Bu sizin için önemli olabilir veya olmayabilir.
Evan

4
O zaman kullan ConcurrentHashMap<WeakReference<T>>. docs.oracle.com/javase/7/docs/api/java/lang/ref/…
jdmichal

19

Bellek içi java önbelleği için başka bir seçenek de cache2k'dir . Bellek içi performans, EHCache ve google guava'dan daha üstündür, cache2k karşılaştırma sayfasına bakın .

Kullanım şekli diğer önbelleklere benzer. İşte bir örnek:

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

Bağımlılık olarak google guava'nız varsa, guava önbelleğini denemek iyi bir alternatif olabilir.


cruftex, uygulamamı kapatırsam, önbellek kayıtlı tüm verileri yok edecek mi yoksa yok mu?
Menai Ala Eddine - Aladdin

10

İmcache'yi kolayca kullanabilirsiniz . Örnek bir kod aşağıdadır.

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

9

Bunu dene:

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

}

Senkronize bir haritaya güvenme ile ilgili sorunlar başka cevaplarda zaten tartışılmıştı.
aklıselim

@sergeyB: Önbelleği uygulamak için benzer bir çözüm arıyordum ... Teşekkürler
Prakruti Pathik

1
public static SimpleCacheManager getInstance() {gerektiğini public synchronized static SimpleCacheManager getInstance() {, aksi takdirde if (instance == null) {iş parçacığı güvenli değil. Bu durumda, tüm getInstance () çağrıları için senkronizasyon gerçekleştiği için monitör nesnesini hep birlikte kaldırabilirsiniz, bakınız: javaworld.com/article/2073352/core-java/…
Can Kavaklıoğlu

Singleton için bir enum kullanmanızı tavsiye edebilir miyim? dzone.com/articles/java-singletons-using-enum
Erk



0

Deneyin EHCache ? Göz atma işlevselliğinizi kontrol edebilmeniz için kendi önbelleğe alma süre sonu algoritmalarınızı eklemenize olanak tanır.

Diske, veritabanına, bir küme üzerinden vb. Seri hale getirebilirsiniz.

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.