web-dev-qa-db-ja.com

高性能のスレッドセーフキャッシングのためのGuavaの使用

高性能のスレッドセーフキャッシュを実装しようとしています。これが私が実装したコードです。オンデマンドコンピューティングは必要ありません。 cache.asMap()を使用して値を安全に取得できますか?キャッシュがsoftValuesを持つように設定されている場合でも、

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

ここにグアバの貢献者:

はい、それは問題ないように見えますが、別のオブジェクトでキャッシュをラップすることの要点はわかりません。 (また、Cache.getIfPresent(key)Cache.asMap().get(key)と完全に同等です。)

29
Louis Wasserman

高いパフォーマンスが必要な場合は、同期されたgetInstance()を使用する代わりに、キャッシュを静的にインスタンス化してみませんか?

6
Frank Pavageau