指定されたタイムアウト後にエントリを自動的に消去する Java Map または同様の標準データ ストアをご存知の方はいらっしゃいますか? これは、期限切れの古いエントリが自動的に「古くなる」ことを意味します。
私はその機能を自分で実装する方法を知っており、過去に何度か実行したことがあるので、その点に関するアドバイスを求めているのではなく、適切なリファレンス実装への指針を求めています。
弱い参照次のようなソリューションに基づく弱いハッシュマップオプションではありません。キーは非インターン文字列である可能性があり、ガベージ コレクターに依存しない構成可能なタイムアウトが必要なためです。
エキャッシュこれも外部構成ファイルが必要なので、頼りたくないオプションです。コードのみのソリューションを探しています。
ベストアンサー1
はい。Googleコレクション、またはグアバ名前の通り、今はマップメーカーまさにそれが実現できます。
ConcurrentMap<Key, Graph> graphs = new MapMaker()
.concurrencyLevel(4)
.softKeys()
.weakValues()
.maximumSize(10000)
.expiration(10, TimeUnit.MINUTES)
.makeComputingMap(
new Function<Key, Graph>() {
public Graph apply(Key key) {
return createExpensiveGraph(key);
}
});
アップデート:
guava 10.0(2011年9月28日リリース)以降、これらのMapMakerメソッドの多くは廃止され、新しいキャッシュビルダー:
LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
.maximumSize(10000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build(
new CacheLoader<Key, Graph>() {
public Graph load(Key key) throws AnyException {
return createExpensiveGraph(key);
}
});