4

アドバイスを探しているだけです。私たちの Web ページの 1 つに、討論/フォーラム サイトがあります。ユーザーが討論ページをリクエストするたびに、すべてのトピックのリスト (および回答の数など) を取得します。

ユーザーが特定のトピック/スレッドを要求すると、スレッドへのすべての回答が、ユーザー名、ユーザーの写真、年齢、回答の投稿者からのフォーラム投稿の合計数と共に表示されます。

現在、すべてのコンテンツは、ページにアクセスするたびに MySQL クエリを使用して取得されます。しかし、これは非常に遅くなり始めています (特に大きなスレッドでは、+3000 回答)。

このプロセスを高速化するために、何らかの形で討論エントリをキャッシュしたいと思います。ただし、問題は、エントリ自体をキャッシュすると、投稿の数など (もちろん動的です) が常に最新であるとは限らないことです。

このようなものが更新されたときにページをキャッシュ/再キャッシュするスマートな方法はありますか? :)

前もってありがとう、フィッシャー

4

2 に答える 2

0

面白い話題!

私が最初に検討するのは、データベースの最適化です。ハードウェアのアップグレードにお金を費やす必要がある場合でも、キャッシュを導入するよりもはるかに簡単で安価です。可動部品が少なく、問題が発生する可能性が少なくなります...

データベースのパフォーマンスをさらに引き出すことができない場合、次に検討することは、データを少し非正規化することです。たとえば、各トピックに対する返信をカウントするのではなく、「reply_count」列を維持します。これは見苦しいですが、問題が発生する可能性が少なくなります。運が良ければ、データ アクセス レイヤーのすべてのロジックをローカライズできます。

次に検討するオプションは、ページをキャッシュすることです。たとえば、「討論ページ」を 30 秒間キャッシュするだけで、適切なレベルのトラフィックがあれば、データベースの負荷が劇的に軽減されます。ページ全体をキャッシュしているため、すべてがうまくいかなかったとしても、次にページが古くなったときに自動的に整理されます。ほとんどの場合、ページ全体をキャッシュしても問題ありません。過去 30 秒間に新しい投稿が表示され、それがページに表示されなくても、世界の終わりではありません。

ページにもっと「最新」のコンテンツを提供する必要がある場合は、データベース アクセス レベルでキャッシュを導入することができます。過去に、結果をキャッシュする期間に関するハードワイヤード ロジックに基づいて、SQL クエリの結果をキャッシュするデータベース アクセス レイヤーを構築しました。私たちの場合、データベースを呼び出す関数を作成しました。これにより、クエリ (ユーザーの投稿を取得するなど)、パラメーターの配列 (ユーザー名、日付からの日付など)、およびキャッシュ期間を指定できます。データベース アクセス関数は、クエリとパラメーターに基づいて、キャッシュ期間の結果をキャッシュします。キャッシュの有効期限が切れた場合は、キャッシュが更新されます。このスキームはかなりバグ防止でした - エンド ユーザーとして、キャッシングによる奇妙さに気付くことはめったにありません。また、キャッシュ期間をかなり短く保ったため、すべてが非常に迅速に解決されました。

コンテンツのスニペットをキャッシュしてページを構築することは可能ですが、すぐに恐ろしく複雑になります。キャッシング ポリシーが異なるため、エンド ユーザーにとって意味のないページを作成するのは非常に簡単です。「概要」と「詳細"。

于 2012-08-08T20:06:08.040 に答える