学習Guava Cache(二)Guava caches(1)Cacheクラス

3960 ワード

Guava Cacheキャッシュメカニズムには、CacheとLoadingCacheの2つの基本的なインタフェースがあります.LoadingCacheインタフェースはCacheインタフェースから継承されています.本編では、まずCacheインタフェースについて学びます.

Cache


Cacheインタフェースはキーと値のマッピングを提供し、このクラスがスレッドで安全であり、同時実行に使用できることを実現します.
put(K key, V value)

この方法は主に値を割り当てることであり、1つのキー値のペアを挿入すると、同じキーに対して、新しいvalueが古いvalueに代わる.
V get(K key, Callable extends V> loader)

このkeyに関連付けられた値を返します.このメソッドは、従来のif cached,returnまたはcreate,cache and returnモードを改善します.より良い提案は、LoadingCacheのV get(K key)の方法を採用することができます.
V value = cache.get(key, Callable Extends V> value);

上記の方法では、現在のvalue値が取得されます.値が存在しない場合、Callbackインスタンスからvalue値が抽出され、keyによってvalueが関連付けられ、対応するvalue値が返されます.これにより、次のスタイルの代わりにメソッドを呼び出すプログラミングが提供されます.
value = cache.get(key);
if(value == null){
    value = someService.retrieveValue();
    cache.put(key,value);
}

LoadingCache


LoadingCacheはインタフェースクラスで、Cacheを継承します.Cacheインタフェースの自動マウント機能を拡張しました.スレッドは安全で、マルチスレッド同時実行に使用できます.
Book book = loadingCache.get(id);

上のコードでは、getメソッド呼び出し実行時にbookオブジェクトが使用できない場合、LoadingCacheはオブジェクトを返す方法を知り、キャッシュに保存し、value値を返します.

Loading values


LoadingCacheの実装はスレッドが安全であるため、同じkey値でgetメソッドを呼び出すことで、キャッシュがまだマウントされている間にスレッドがブロックされます.value値がロードされると、呼び出しは最も元の呼び出しgetメソッドが返すvalue値を返します.しかし、異なるkey値を通過する複数の呼び出しは同時にロードされます.キー値のセットを持っていて、各キーに対応するvalue値を取得するには、次のように呼び出す必要があります.
ImmutableMap<key,value> map = cache.getAll(Iterable<? Extends  key>);

以上のように、getAllメソッドは、キー値とキー値に関連付けられたキャッシュ内のvalue値を指定することによって、getAllが返すmapがすべてのキャッシュのvalue値であるか、新しく取得したvalue値であるか、既存のキャッシュと新しく取得したvalue値の混合であるかの不変のMapセットを返します.

Refreshing values in the cache


LoadingCacheは、キャッシュ内でvalue値を更新するメカニズムを提供します.
void refresh(K key)

refreshメソッドを呼び出すと、LoadingCacheは対応するkeyの新しいvalue値を取得し、現在のvalue値は新しいvalue値が戻る前にキャッシュから破棄されません.これは、ロード中にgetメソッドを呼び出すと、キャッシュ内の現在のvalue値が返されることを意味します.refreshメソッド呼び出しで例外が発生した場合、元のvalue値はキャッシュに保存されます.value値が非同期で取得されると、value値が実際に更新される前に、メソッドは元のvalue値を返します.