2

私は、多くのプロセスがリクエストを処理できる高負荷の Web サービスで、中央のキャッシュを使用して発生する可能性がある問題について考えてきました。

問題は、キャッシュ エントリの値がデータベースで変更されたときに期限切れになるキャッシュ エントリが、パフォーマンスに大きな影響を与える可能性があることです。期限切れのエントリが同時に多くのリクエストによってリクエストされた場合、リクエストごとに 1 回データベースにアクセスすることになります。

データベースを更新するたびにキャッシュを更新してそれを回避できますが、競合状態が発生します。

これをどのように解決しますか?

4

1 に答える 1

0

私自身、この状況に陥ったことがあります。ここでの解決策は、キャッシュを期限切れにするのではなく、更新することです。データベースが新しいコンテンツで更新されたら、キャッシュを更新します。出来上がり、レース条件はありません。更新が失敗した場合 (または数秒かかる場合)、データベースはキャッシュされていないデータを取得しようとして攻撃を受けることはありません。これは、フォールバックする古いキャッシュがあるためです。:)

編集:

スレッドが互いに競合する問題を解決するには、何らかのミューテックス ロックを組み込む必要があります。当然、自分の言語に適したものを使用します。

基本的には相互排除です。

ロジックの一部をロックすると、他のスレッドは待機する必要があります。これにより、データの破損が回避されます。

次に例を示します。

一部のスレッドがデータベースを更新したい:

  1. ミューテックス ロックを追加します。
  2. データベースを更新します。
  3. キャッシュを更新します。
  4. ミューテックスのロックを解除します。
于 2013-01-14T21:14:53.610 に答える