2012-06-20 10 views
13

Estoy tratando de implementar un almacenamiento en caché seguro de subprocesos de alto rendimiento. Aquí está el código que he implementado. No quiero ninguna informática bajo demanda. ¿Puedo usar cache.asMap() y recuperar el valor de forma segura? Incluso si la memoria caché está configurada para tener SoftValues?Uso de Guava para el almacenamiento en memoria caché seguro de alto rendimiento

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

Como curiosidad, ¿realmente espera tener 10000 hilos accediendo a su Caché al mismo tiempo? Lo pregunto porque ese es el valor que está usando como nivel de concurrencia. – pcalcao

+0

No, he eliminado ese parámetro. Ahora estoy usando el nivel de concurrencia predeterminado, es decir, 4. Gracias por señalarlo. – systemboot

Respuesta

21

guayaba colaborador aquí:

Sí, que se ve muy bien, aunque no estoy seguro de lo que es el punto de envolver la caché en otro objeto. (Además, Cache.getIfPresent(key) es totalmente equivalente a Cache.asMap().get(key).)

+0

¿El hilo de caché de guayaba es seguro de forma nativa? –

+5

@GaryGauh sí lo es. –

6

Si desea un alto rendimiento, ¿por qué no instancia el Caché estáticamente en lugar de usar un getInstance sincronizado()?

+1

De acuerdo. Usar este modismo podría remediar la sincronización en getInstance(): https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom – bennidi

Cuestiones relacionadas