2

オブジェクトをメモリにキャッシュしたい。要件は次のとおりです。

  1. すべてのレコード/オブジェクトは一意のキーに関連付けられています。
  2. 保存する400〜500のレコード/オブジェクト。レコード数が指定された制限を超えて増加した場合は、古いレコードを削除する必要があります。
  3. レコードは2分を超えて保存しないでください。
  4. JVMがメモリを使い果たしているときにスケールダウンする必要があります(弱参照の一種)。
  5. サードパーティのライブラリはモジュールが小さく、不要なネットワークアクセスを減らすことを目的としているため、使用できません。
  6. 書き込みが多く、読み取りが少ない

機密データをキャッシュするため、セキュリティもここで懸念されます。このデータはメモリにキャッシュされます。本当にセキュリティを心配してデータを暗号化する必要がありますか?

同様の機能を提供するJavaクラスを探しています。

WeakHashMap現在、要件に準拠するために、さまざまなプライベート/パブリックメソッドを拡張および実装することを考えています。

他にアイデアがあれば、ここで共有してください。

4

3 に答える 3

3

を使用したくありませんWeakHashMapSoftHashMap近いですが、標準ライブラリでは利用できません。私があなただったら、ヒントを得るため にGuava のキャッシュ クラスを調べます。

しかし、ここにいくつかの追加の考えがあります:

JVM がメモリ不足になったときにスケールダウンする必要があります (弱参照のようなもの)。

つまりsoft reference。とにかく、この要件は私には少し匂いがします。私が認める有効な要件である可能性がありますが、これが本当に必要になることはめったにありません。レコードのサイズを適切に予測でき、キャッシュするレコードの数に厳密な制限を設けることを計画している場合、この複雑さは必要ない可能性があります。

サードパーティのライブラリは使用しないでください。

誰もがこれに言及しました、そして彼らは正しいです。

セキュリティの面では、メモリ内にキャッシュされたデータを暗号化することの有効性は疑わしいです。暗号化キーもメモリ内に保持する必要があります。攻撃者がメモリの内容を読み取ることよりも、心配すべきことがたくさんあるに違いありません。

于 2012-09-18T17:55:35.670 に答える
2

いいえ、これを行うべきではありません。WeakHashMap はキャッシュではありません!

これで、WeakHashMap がキャッシングで機能しない理由を簡単に理解できます。まず第一に、マップ値ではなくキーにソフト参照を使用するため、とにかく機能しません。さらに、ガベージ コレクターは、弱い参照によってのみ参照されるメモリを積極的に再利用します。これは、WeakHashMap でキーとして機能しているオブジェクトへの最後の強い参照を失うと、ガベージ コレクターがすぐにそのマップ エントリを再利用することを意味します。

...

では、Java でキャッシュを実装するにはどうすればよいのでしょうか。

私の提案は、 JCSOSCacheなど、自由に利用できる Cache 実装の 1 つを使用することです。これらのライブラリは、LRU および FIFO ポリシー (ディスク オーバーフロー、データ有効期限、その他多くのオプションの高度な機能など) を使用して、より優れたメモリ管理を提供します。

@ user463324 が言及しているように、 Apache 2.0ライセンスの下にあるGoogle Guavaなど、これを既に実装しているライブラリを使用する必要があります。ここで発明されていないことは、解決策を無視する正当な理由にはなりません。

于 2012-09-18T17:41:12.207 に答える
0

JCS または Memcache/EHCache の 2 つのオプションがあります。

2 つのオプションは機能的に同等ですが、いくつかの重要な違いがあります。JCS を使用すると、キャッシュされたオブジェクトはシリアライズ/デシリアライズされません。それらは Java オブジェクトのままであるため、それらの格納と取得は非常に高速です。ただし、これは、キャッシュが JVM 内にあるため、JVM のヒープを使用し、他の JVM からもアクセスできないことを意味します。[JCS は、ある種の分散機能をアドオンとして提供します]。

一方、Memcache/Ehcache は、put/get 操作を実行しながらシリアル化/逆シリアル化を実行する外部キャッシュです。これにより、極端な場合にはキャッシュの利点が失われる可能性があります。そのため、速度のベンチマークは不可欠です。適切な場合は、分散され、独自のメモリを使用し、別のボックスにある可能性があります。ただし、これは、JVM と外部キャッシュの間のデータのセキュリティを考慮する必要があることも意味します。

于 2012-09-18T17:52:48.713 に答える