1. ホーム

[解決済み】Javaの期限付きマップ/キャッシュ【終了しました

2022-03-30 12:13:02

質問

Java Mapやそれに類する標準的なデータストアで、所定のタイムアウト後にエントリを自動的にパージするものをご存知の方はいらっしゃいますか?これは、古い期限切れのエントリーが自動的に「エイジアウト」する、エージングを意味します。

できればMavenでアクセスできるオープンソースライブラリでお願いします。

自分で実装する方法は知っているし、過去に何度かやったことがあるので、その点でのアドバイスではなく、良いリファレンス実装へのポインタを求めています。

ウィークリーリファレンス のようなベースのソリューションがあります。 ウィークハッシュマップ なぜなら、キーが非内部連結文字列である可能性が高く、ガベージコレクタに依存しない設定可能なタイムアウトが必要だからです。

Ehcache も、外部設定ファイルを必要とするため、あまり頼りたくないオプションです。私はコードのみの解決策を探しています。

どのように解決するのですか?

はい。グーグルコレクション、または グアバ という名前のものがあります。 マップメーカー というようなことができます。

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 メソッドの多くは非推奨となり、新しいメソッドである CacheBuilder :

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