4

DBから同じデータを照会する代わりに、ハッシュマップにいくつかのデータをキャッシュし、そこからデータを取得する設計を実装しました。

私の考えは正しいですか?

4

7 に答える 7

7

データのコピーをメモリに保持する方が、DB からフェッチするよりも確実に高速です。

とはいえ、考慮すべきさらなる考慮事項があります。

  1. インメモリ コピーを保持している間に DB 内のデータを変更できますか? もしそうなら、あなたはそれにどのように対処しますか?
  2. メモリ消費は問題になるでしょうか?
  3. 想像上のボトルネックではなく、実際のボトルネックを最適化していると確信していますか?
于 2012-12-20T13:37:54.863 に答える
4

コレクションにヒットすることは、DB、特に別のサーバーにあるDBにヒットするよりも数桁速くなります(通信遅延のため)

それは言った:

  • データベースはデータ自体をキャッシュできるため、この最適化は必要ない場合があります
  • データが非常に大きい場合、メモリ消費に対処する必要があります
  • キャッシュを無効にするなど、データの更新に対処する必要がある
于 2012-12-20T13:38:14.110 に答える
3

データベースと対話するときに何が起こるかを考えれば、これに自分で答えることができます。

  1. プログラムはクエリをデータベースに送信する必要があります。データベース サーバーがインプロセスで実行されているか、ネットワーク上の別の場所で実行されているかによって、これには数マイクロ秒から数ミリ秒かかる場合があります。
  2. データベース サーバーはクエリを解析し、実行計画を生成する必要があります。サーバーによっては、頻繁に実行されるクエリの実行プランをキャッシュする場合があります。そうでない場合は、計画を生成するためにさらに数マイクロ秒かかることを計画してください。
  3. データベース サーバーは、データにアクセスするために必要なディスク ブロックを読み取って、計画を実行する必要があります。各ディスク アクセスには数十ミリ秒かかります。テーブルの大きさとインデックスの作成状況によっては、クエリに数秒かかる場合があります。
  4. データベース サーバーは、データをパッケージ化してアプリケーションに送り返す必要があります。繰り返しになりますが、処理中かネットワーク経由かに応じて、これにはマイクロ秒からミリ秒かかり、送り返されるデータの量によって異なります。
  5. アプリケーションは、取得したデータを有用な形式に変換する必要があります。これはおそらくマイクロ秒以下です。

比較すると、ハッシュされたデータ構造のルックアップには、それぞれ数ナノ秒かかる場合があるいくつかのメモリアクセスが必要です。その違いは数桁です

于 2012-12-20T15:43:44.230 に答える
2

考慮すべき主な懸念事項は、キャッシュのサイズです。特定のしきい値を超えると、良いよりも多くのダメージを与えています。たとえば、キャッシュに 100 万のエントリがあり、各エントリが 1 KB である場合 (各オブジェクトのオーバーヘッドを考慮すると、到達するのはそれほど難しくありません)、1 ギガバイトのヒープを占有していることになります。その場合、主要な GC のパフォーマンスもひどいものになります。

于 2012-12-20T13:42:57.453 に答える
0

コード レベルで行うよりも常に DB にアクセスするコストが高くなります。

于 2012-12-20T13:39:03.037 に答える
0

このように見てください: データベースに問い合わせるには、とにかくバイトをメモリにコピーする必要があります。したがって、メモリにアクセスするだけで、データベースにアクセスするよりも常に高速になります。

于 2012-12-20T13:39:06.050 に答える
0

ハッシュコードの計算コストが低い場合は、はるかに高速になるはずです。これは、エントリの数にも依存します (衝突が増えるため)。

于 2012-12-20T13:39:09.210 に答える