データベースを直接チェックする代わりに、このキャッシュを使用できるように、一部のデータをキャッシュする Java コレクション (リスト、マップなど) を使用したいと考えています。私の唯一の心配はコレクションのサイズです。このキャッシュに 1000 エントリだけ保存してもらいたいのですが、この数に達したら、最も古いエントリを削除して新しいエントリを入れたいと思います。これは可能ですか?
5 に答える
LinkedHashMapを見てください。オーバーライドremoveEldestEntry
すると、マップ内の最も古いエントリがいつ削除されるか (put
またはputAll
が呼び出されたとき) を制御できます。
Google Guava が提供するキャッシュ ユーティリティを使用できます: http://code.google.com/p/guava-libraries/wiki/CachesExplained
キャッシュされた各オブジェクトの「重み」に応じて、複数のバリアントがあります。ユースケースにより適したものを選択してください。
固定サイズのキャッシュ (コレクションを使用して実装し、そのサイズを追跡できます)。これは、オブジェクトが適度に小さく、メモリー使用量を事前に十分に見積もることができる場合にうまく機能します。他の回答は、基本的にこのタイプを実装する方法を示しています。
ガベージ コレクターによる自動削除による動的キャッシュ。これは、キャッシュされるオブジェクトが大きく (または、ファイルや画像など、サイズが大きく異なる)、キャッシュに使用できるヒープをできるだけ多く使用したい場合にうまく機能します。キャッシュは、java.lang.SoftReference のコレクションを管理して、オブジェクトを存続させます。ガベージ コレクターは、メモリが必要なときに(参照をクリアすることによって) キャッシュされたオブジェクトを再利用します。このアプローチの欠点は、オブジェクトの削除を制御できないことです。GC が、いつ、どのオブジェクトを削除するかを決定します。
両方の組み合わせ、最新のヒット用の (小さい) 固定サイズのキャッシュ、第 2 レベル用の動的 GC 処理されたもの。
適切に構成されていれば、いずれも OutOfMemory エラーが発生することはありません。
Apachecommonsには循環FIFOバッファーがあります。それがあなたが探しているものだと思います。
そのドキュメントから
CircularFifoBuffer is a first in first out buffer with a fixed size that replaces its oldest element if full.
またはその他
AbstractQueue
Javaライブラリで拡張する独自のクラスを作成できます。
Java は、 と呼ばれるインターフェースとQueue
、このインターフェースのいくつかの実装を提供します。
問題に最適な選択を確認できます。見てみる
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Queue.html
http://docs.oracle.com/javase/tutorial/collections/implementations/queue.html