2017-04-14 6 views
0

は、私は&がCacheGuava:Cache.asMap()。remove()が優れていますか?

final Cache<String, PendingRequest> pendingRequest = CacheBuilder.newBuilder().build(); 

// get first 
pendingCall = pendingRequest.getIfPresent(key); 
pendingRequest.invalidate(key); // then remove. 

から項目を削除取得したい私はまた

pendingCall = pendingRequest.asMap().remove(key); 

別の方法を発見したasMap方法は、すべてのアイテムのクローンを作成していますか?それは重い呼びですか?パフォーマンスを考えている方が良い方法はどれですか。

答えて

1

Cache#asMap()は次のように定義されているため、これらの呼び出しの間には実質的な違いはありません:

スレッドセーフなマップとして、このキャッシュに格納されているエントリのビューを返します

マップに加えられた変更は、キャッシュに直接影響します。しかし、時定数(無視できる)である(それはビューを作成する必要があります可能なので)と、実装の詳細であるasMap()わずかに少ないパフォーマンスかもしれ呼び出す

(詳細は内部グアバLocalCache and LocalManualCache classesを参照してください)。

より重要である何、Cache#invalidate(K)がより慣用的であり、あなたがキーに関連付けられて返された値を必要としない場合、私はそれ以外の使用、代わりにマップビュー方式の(以下@BenManes'コメントの後編集)を、それを使用してお勧めしますマップビュー。

+3

より慣用的ですが、削除された値が必要な状況ではビューが便利です。この操作はアトミックですが、2つの操作を実行する彼の選択肢はレイシーです。キャッシュインタフェースは慣用的でシンプルな抽象化を提供し、ビューはより高度なニーズに対応するエスケープハッチを提供します。 –

+0

@BenManesあなたが正しいです、私はそのOPを削除値を使用する必要があるキャッチしていない。 – Xaerxess

関連する問題