面白い話題!
私が最初に検討するのは、データベースの最適化です。ハードウェアのアップグレードにお金を費やす必要がある場合でも、キャッシュを導入するよりもはるかに簡単で安価です。可動部品が少なく、問題が発生する可能性が少なくなります...
データベースのパフォーマンスをさらに引き出すことができない場合、次に検討することは、データを少し非正規化することです。たとえば、各トピックに対する返信をカウントするのではなく、「reply_count」列を維持します。これは見苦しいですが、問題が発生する可能性が少なくなります。運が良ければ、データ アクセス レイヤーのすべてのロジックをローカライズできます。
次に検討するオプションは、ページをキャッシュすることです。たとえば、「討論ページ」を 30 秒間キャッシュするだけで、適切なレベルのトラフィックがあれば、データベースの負荷が劇的に軽減されます。ページ全体をキャッシュしているため、すべてがうまくいかなかったとしても、次にページが古くなったときに自動的に整理されます。ほとんどの場合、ページ全体をキャッシュしても問題ありません。過去 30 秒間に新しい投稿が表示され、それがページに表示されなくても、世界の終わりではありません。
ページにもっと「最新」のコンテンツを提供する必要がある場合は、データベース アクセス レベルでキャッシュを導入することができます。過去に、結果をキャッシュする期間に関するハードワイヤード ロジックに基づいて、SQL クエリの結果をキャッシュするデータベース アクセス レイヤーを構築しました。私たちの場合、データベースを呼び出す関数を作成しました。これにより、クエリ (ユーザーの投稿を取得するなど)、パラメーターの配列 (ユーザー名、日付からの日付など)、およびキャッシュ期間を指定できます。データベース アクセス関数は、クエリとパラメーターに基づいて、キャッシュ期間の結果をキャッシュします。キャッシュの有効期限が切れた場合は、キャッシュが更新されます。このスキームはかなりバグ防止でした - エンド ユーザーとして、キャッシングによる奇妙さに気付くことはめったにありません。また、キャッシュ期間をかなり短く保ったため、すべてが非常に迅速に解決されました。
コンテンツのスニペットをキャッシュしてページを構築することは可能ですが、すぐに恐ろしく複雑になります。キャッシング ポリシーが異なるため、エンド ユーザーにとって意味のないページを作成するのは非常に簡単です。「概要」と「詳細"。