これは....の仕事のようですねnew ObjectOutputStream(new FileOutputStream(STORAGE_DIR + "/" + key + ".dat");!!
真剣に-最も簡単な方法は、保存するデータテーブルごとにファイルを作成し、データをシリアル化し、読み取りたいときにファイル名としてキーを使用して検索することです。
適切なファイル システムでは、書き込みをアトミックにすることができます (一時ファイルに書き込み、ファイルの名前を変更することにより)。読み取り/書き込み速度は、数十 MBit/秒で測定されます。ルックアップは、単純なディレクトリ ツリーを作成することで非常に効率的にすることができますSTORAGE_DIR + "/" + key.substring(0,2) + "/" + key.substring(0,4) + "/" + key。これは、数百万のエントリでも効率的であり、ファイル システムがインデックス付きディレクトリを使用している場合はさらに効率的です。最後に、さらに高速な検索のために、この上にメモリ バックアップされた LRU キャッシュを実装するのは簡単です。
圧縮に関して - Jakarta の commons-compress を使用して、データを保存する前に gzip または bzip2 圧縮に影響を与えることができます。ただし、これは最適化の問題であり、アプリケーションと使用可能なディスク容量によっては、CPU サイクルを他の場所に投資した方がよい場合があります。
私が作成した実装例を次に示します: http://geek.co.il/articles/geek-storage.zip。設定された最大サイズでキャッシュからオブジェクトを格納および取得するためのメソッドを提供する単純なインターフェイス (クリーンとはほど遠い - 概念の単なるデモンストレーションです) を使用します。キャッシュミスは処理のためにユーザー実装に転送され、キャッシュはストレージ要件を超えていないことを定期的にチェックし、古いデータを削除します。
また、MySQL を使用した実装を完成させ、ディスク ベースの実装と MySQL ベースの実装を比較するためのベンチマークも含めました。私のホーム マシン (古い Athlon 64) では、ディスク ベンチマークのスコアが、付属のベンチマークでの MySQL 実装の 2 倍よりも優れています (9.01 秒対 18.17 秒)。DB の実装を微調整して、パフォーマンスをわずかに向上させることができるかもしれませんが、問題を十分に示していると思います。
これを自由に使用してください。