あなたのコードは私に多くを教えてくれません。プレーンなJSON/SQLでデータ構造をレイアウトできれば便利だと思います。
とにかく、私は各ユーザーのストリームをMongoDBにシリアル化します。さまざまな理由で(少なくともソフトウェアのそのレベルでは)、HTMLをデータベースに保存しませんでした。代わりに、関連するデータを(おそらく多形の)コレクションに保存する必要があります。ニュースフィードの取得は非常に簡単で、インデックス作成は簡単です。ビューの構造は基本的に変更されません。後でHTMLを変更したい場合は、それも簡単です。
欠点は、これにより多くのデータが複製されることです。フォロワーが多いと問題になるかもしれません。単一のユーザーIDの代わりにユーザーIDの配列を使用すると役立つ場合がありますが(情報がすべてのフォロワーで同じである場合)、制限もあります。
非常に大きな関連付けの問題の場合、キャッシュのみがあります。私の理解では、FacebookとTwitterの両方の魔法は、データベースに頻繁にアクセスせず、RAMに大量のデータを保持することです。数十億のアイテムを関連付ける場合、RAMでもそれを行うのは困難です。
更新は、1時間ごとではなく、継続的に書き込む必要があります。トラフィックが多く、1時間ごとの更新に30分かかるとします。現在、最悪のケースは90分です。遅れ。変更をジャストインタイムで処理する場合は、これをおそらく5分に短縮できます。
ある時点で仮定を投入し、キャッシングといくつかのヒューリスティックを使用する必要があります。いくつかの例:
- 最近のツイートほど、より多くのトラフィックが表示されます。リツイートされる可能性が高く、頻繁に見られます。 RAMに保存します。
- 1991年のFacebookのタイムラインの概要ページはおそらく毎日変更されないため、これは長期的な出力キャッシュの候補です。
- 現在のFacebookの活動は、多くの書き込みを受ける可能性があります。ここでは、出力キャッシュはあまり役に立ちません。この場合も、オブジェクトはRAMに保持する必要があります。