14

時間のかかる計算結果に頻繁にアクセスする必要があります。結果はめったに変更されないので、時々データを再計算する必要がありますが、しばらくの間、古い結果を使用しても問題ありません。これを行う最も簡単な方法は何でしょうか。既存のライブラリメソッドまたはデザインパターンはありますか?

私は次のようなことを考えています

private static List myCachedList = null;

...

// refresh list once in 3600 seconds
if (needsRefresh(myCachedList, 3600)) {
    // run the calculation
    myCachedList = ...
}
// use either updated or previous value from here on

適切な実装は簡単ではないかもしれません。スレッドセーフや競合状態などに対処する必要があるかもしれません。そのため、ここで自分で実装するよりも、実績のある実装を使用したいと思います。

4

5 に答える 5

21

自分で書くことは、最初に表示されるとさらに面倒になる可能性があることを認識していただきありがとうございます。

Guavaキャッシュソリューションをチェックアウトします。Guava は実績のあるライブラリであり、流暢なファクトリ API を介してキャッシュを簡単に利用 (および構成可能) できます。

すべての Guava キャッシュは、読み込み中かどうかに関係なく、メソッド get(K, Callable<V>) をサポートしています。このメソッドは、キャッシュ内のキーに関連付けられた値を返すか、指定された Callable から値を計算してキャッシュに追加します。読み込みが完了するまで、このキャッシュに関連付けられた監視可能な状態は変更されません。このメソッドは、従来の「キャッシュされている場合は返す、そうでない場合は作成し、キャッシュしてから返す」という従来のパターンに代わる単純な方法です。

于 2012-10-31T13:06:53.277 に答える
3

プロキシクラスでキャッシングロジックの実装をカプセル化できるように、プロキシデザインパターンを使用することをお勧めします

あなたのニーズに合うように見えるクールな例がここにあります

http://en.wikipedia.org/wiki/Proxy_pattern

于 2012-10-31T13:08:59.463 に答える
3

Google guava-librariesを見てみましょう。この作業の多くはすでに行われています。

具体的には Timed Eviction というセクションがあり、これはあなたが望むものに関連している可能性があります。 https://github.com/google/guava/wiki/CachesExplained#timed-eviction

于 2012-10-31T13:06:57.513 に答える