Guava(キャッシュ)


キャッシュ:
MapMakerクラス
  • MapMakerは、ほとんどの基本キャッシュ機能の提供者として機能する.
  • ConcurrentMap<String,Book> books = new MapMaker().concurrencyLevel(2) //    ,     2       ,     4
                                                     .softValues() //  SoftReference      value
                                                     .makeMap(); //  Map  

    Guavaキャッシュ:
    Cacheクラス:
  • 基本動作
  • put(key,value); //  key-value
    V value = cache.get(key, Callable<? Extends V> value); //  key       ,      Callable   call     key    

    上記のcache.getは、通常の操作の代わりに有効です.
    value = cache.get(key);
       if(value == null){
           value = someService.retrieveValue();
           cache.put(key,value);
       }

    Callableで値を取得するのは非同期プロセスです.非同期で値を取得することもできます.
    cache.get(key,Callables.returning(someService.retrieveValue()); //          key  

    キャッシュされたデータを無効にすることもできます.
    invalidate(key) //  key     
    invalidateAll() //       
    invalidateAll(Iterable<?> keys) //  keys     

    LoadingCacheクラス:
  • LoadingCacheはCacheの拡張クラスであり、セルフロード機能を有する.
  • 基本操作.
  • Book book = loadingCache.get(id); //  key id   
    ImmutableMap<key,value> map = cache.getAll(Iterable<? Extends key>); //    key   ,      map  
    refresh(key); //  key     

    CacheBuilderクラス:
  • CacheBuilderは、ビルダーモードによってCacheおよびLoadingCacheインスタンスを構築する.
  • LoadingCacheオブジェクトインスタンス1を構築します.
  • LoadingCache<String, TradeAccount> traLoadingCache =
                    CacheBuilder.newBuilder()
                        .expireAfterAccess(5L, TimeUnit.MINUTES) //5       
                        .maximumSize(5000L) //    5000   
                        .removalListener(new TradeAccountRemovalListener()) //           
                        .ticker(Ticker.systemTicker()) //                 
                        .build(new CacheLoader<String, TradeAccount>(){ 
                            @Override
                            public TradeAccount load(String key) throws Exception {
                                // load a new TradeAccount not exists in cache
                                return null;
                            }
                        });
  • SoftReferenceオブジェクトによる自動回収
  • を実現する.
    LoadingCache<String, TradeAccount> traLoadingCache =
                    CacheBuilder.newBuilder()
                        .expireAfterAccess(5L, TimeUnit.MINUTES) //5       
                        .softValues() //  SoftReference    value,        ,    
                        .removalListener(new TradeAccountRemovalListener()) //           
                        .ticker(Ticker.systemTicker()) //                 
                        .build(new CacheLoader<String, TradeAccount>(){ 
                            @Override
                            public TradeAccount load(String key) throws Exception {
                                // load a new TradeAccount not exists in cache
                                return null;
                            }
                        });
  • キャッシュを自動的にリフレッシュできるLoadingCache
  • を構築
    LoadingCache<String, TradeAccount> traLoadingCache =
                    CacheBuilder.newBuilder()
                        .concurrencyLevel(10) //      10       
                        .refreshAfterWrite(5L, TimeUnit.SECONDS) //5       
                        .removalListener(new TradeAccountRemovalListener()) //           
                        .ticker(Ticker.systemTicker()) //                 
                        .build(new CacheLoader<String, TradeAccount>(){ 
                            @Override
                            public TradeAccount load(String key) throws Exception {
                                // load a new TradeAccount not exists in cache
                                return null;
                            }
                        });

    CacheBuilderSpec:
  • CacheBuilderSpecは、CacheBuilderを構築する際の構成の説明に使用することができる.
  • String configString = "concurrencyLevel=10,refreshAfterWrite=5s"
  • CacheBuilderSpecによるLoadingCacheの構築:
  • String spec = "concurrencyLevel=10,expireAfterAccess=5m,softValues";
    CacheBuilderSpec cacheBuilderSpec = CacheBuilderSpec.parse(spec);
    CacheBuilder<Object, Object> cacheBuilder = CacheBuilder.from(cacheBuilderSpec);
    LoadingCache<String, TradeAccount> traLoadingCache = cacheBuilder
            .ticker(Ticker.systemTicker())
            .removalListener(new TradeAccountRemovalListener())
            .build(new CacheLoader<String, TradeAccount>(){ 
                @Override
                public TradeAccount load(String key) throws Exception {
                    // load a new TradeAccount not exists in cache
                    return null;
                }
    });

    CacheLoaderクラス:
  • CacheLoader
  • の構築
    // Function  CacheLoader,         
    CacheLoader<Key,value> cacheLoader = CacheLoader.from(Function<Key,Value> func);
    //  Supplier  CacheLoader
    CacheLoader<Object,Value> cacheLoader = CacheLoader.from(Supplier<Value> supplier);

    CacheStatsクラス:
  • は、いくつかのキャッシュ情報を収集するために使用される.
  • LoadingCache<String,TradeAccount> tradeAccountCache = CacheBuilder.newBuilder().recordStats() //      
  • CacheStatオブジェクト
  • を取得する
    CacheStats cacheStats = cache.stats();
  • CacheStatで入手可能な情報
  • 1.           
    2.    
    3.     
    ...

    RemovalListenerクラス:
  • Cacheのkeyが除去されたときを傍受するために使用される.

  • RemovalNotificationクラス:
  • は、RemovalListenerをトリガするonRemovalのパラメータ入力を受信するために用いられ、対応するkey、value等を取得することができる.
  • RemovalNotification.getCause()によって、オブジェクトが除去された理由も知ることができる.
  • public enum RemovalCause {
      //      
      EXPLICIT,
      //      
      REPLACED,
      //     
      COLLECTED,
      //    
      EXPIRED,
      //        
      SIZE;
    }

    RemovalListenersクラス:
  • RemovalListenerのonRemovalトリガ動作
  • を非同期で実行できます.
    RemovalListener<String,TradeAccount> myRemovalListener = new RemovalListener<String, TradeAccount>() {
               @Override
               public void onRemoval(RemovalNotification<String,TradeAccount> notification) {
                   //Do something here
               }
           };
    RemovalListener<String,TradeAccount> removalListener =
                            RemovalListeners.asynchronous(myRemovalListener,executorService);

    上記の手順では、RemovalListenerを登録する必要があります. CacheBuilderの前.