2012-06-20 15 views
13

Yüksek performanslı, diş güvenli bir önbelleğe almayı denemeye çalışıyorum. İşte uygulamış olduğum kod. İsteğe bağlı bilgisayar istemiyorum. Cache.asMap() öğesini kullanabilir ve değeri güvenli bir şekilde alabilir miyim? Önbellek softValues'a sahip olsa bile mi? BuradaYüksek performanslı iplik güvenli önbellekleme için Guava'yı kullanma

import java.io.IOException; 
    import java.util.concurrent.ConcurrentMap; 
    import java.util.concurrent.ExecutionException; 
    import java.util.concurrent.TimeUnit; 
    import java.util.concurrent.TimeoutException; 

    import com.google.common.cache.Cache; 
    import com.google.common.cache.CacheBuilder; 

    public class MemoryCache { 

    private static MemoryCache instance; 
    private Cache<String, Object> cache; 

    private MemoryCache(int concurrencyLevel, int expiration, int size) throws IOException { 

     cache = CacheBuilder.newBuilder().concurrencyLevel(concurrencyLevel).maximumSize(size).softValues() 
      .expireAfterWrite(expiration, TimeUnit.SECONDS).build(); 
    } 

    static public synchronized MemoryCache getInstance() throws IOException { 
     if (instance == null) { 
       instance = new MemoryCache(10000, 3600,1000000); 
     } 
     return instance; 
    } 

    public Object get(String key) { 
     ConcurrentMap<String,Object> map =cache.asMap(); 
     return map.get(key); 
    } 

    public void put(String key, Object obj) { 
     cache.put(key, obj); 
    } 
    } 
+4

Bir merak olarak, eş zamanlı olarak önbellekinize erişen 10000 iş parçacığına sahip olmayı gerçekten bekliyor musunuz? Bunun için eşzamanlılık düzeyi olarak kullandığınız değer olduğunu soruyorum. – pcalcao

+0

Hayır Bu parametreyi kaldırdım. Şimdi varsayılan eşzamanlılık düzeyini kullanıyorum. – systemboot

cevap

21

Guava katkıyı: Ben noktası başka bir nesneye önbelleğini sarma ne olduğundan emin değilim ancak

Evet, bu, sadece iyi görünüyor. (Ayrıca, Cache.getIfPresent(key), Cache.asMap().get(key) için tam olarak eşdeğerdir.)

+0

Guava önbellek güvenli midir? –

+5

@GaryGauh evet öyle. –

6

Yüksek performans istiyorsanız, neden senkronize edilmiş bir getInstance() kullanmak yerine, statik olarak Önbelleği kesiştirmiyorsunuz?

+1

Kabul. Bu deyimi kullanarak, getInstance(): https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom adresindeki senkronizasyonu giderir. – bennidi

İlgili konular