www.zipstory.com (ベータ版) で、同じデータベースからのフィードの n 順列がある状況があります。たとえば、誰かが関心のある都市のフィードを取得し、これらの都市をすべてまとめて、最新または最多の投票ですべて並べ替えることができます。
同時に何千ものユーザーがいる場合、使用可能なメモリを完全に使い果たすことなく、ユーザーごとに物事をキャッシュするにはどうすればよいですか?
私の唯一の推測はそうではありません。都市の結果を整理するクライアント側のキャッシュ戦略を考え出すこともできますが、この方法では、都市ごとに 1 つのサイズですべての戦略に適合するようにキャッシュすることもできます。
どのようなアプローチを提案しますか? 私はこの時点で不慣れな場所にいるので、良い戦略を使用できます. このウェブサイトはそうではありませんが、Facebook はそうしていることに気付きました。キャッシュされたユーザー フィードのプールから取得し、クライアント側でそれらを取得する必要があります。よくわかりませんが、私はまだこれを理解できるほど賢くありません。
言い換えると...
各都市には独自のフィードがあります。各ユーザーは、結合された都市フィードの n 順列を持っています。
c# と ASP.NET を使用して、この問題の可能な解決策を確認したいと思います。
この 2013 年 2 月 28 日に追加します。
- ログインするすべてのユーザーに対して、優先都市リストをキャッシュします
- 上位 10 件の投稿結果が都市ごとにキャッシュされ、Linq ベースのオブジェクトに保存されます
- ユーザーが入り、フィードとして x 都市を持っている場合、都市リスト ループを通過し、都市の投稿がキャッシュにあるかどうかを確認します。そうでない場合は、DB から取得し、個々の投稿の html を他の並べ替え要素と共にキャッシュに取り込みます。
- 都市のリストをユーザー向けの 1 つのフィードに再結合します。linq オブジェクトにいくつかの並べ替え要素があるため、それらを適切な順序で並べ替えて、ユーザーに返すことができます。
これは、都市のリストを 1 つの都市のリストに結合する必要があるため、毎回 CPU の作業が発生することを意味しますが、これにより毎回データベースにアクセスする必要がなくなり、ページの応答時間が短縮されます。主な欠点は、以前は都市に対して単一のクエリ UNION を実行していないため、それぞれがキャッシュされていない場合は都市ごとに 1 つのクエリが必要ですが、キャッシュされているか個別にチェックされていない場合は各都市がチェックされるため、10 の都市ごとに 10 のクエリが発生する場合にのみ発生します。サイトはデッド ゾーンです。