4

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 のクエリが発生する場合にのみ発生します。サイトはデッド ゾーンです。

4

3 に答える 3

2

ユーザーごとに必要な最小限の異なる情報のみをキャッシュします。

たとえば、メモリに収まる場合は、フィードの完全なセットをキャッシュし、ユーザーごとに、関心のあるフィードの ID のみを保存します。

彼らがフィードをリクエストしたら、それらをメモリから取り出します。

于 2013-02-06T20:39:06.763 に答える
2

重要なチェーン ポイントに基づいて状況を判断します。

メモリに問題がない場合は、フィード全体をキャッシュし、そこからアイテムを取得することを検討してください。これには、分散キャッシュ ソリューションを使用できます。それらのいくつかは無料です。memcached ( http://memcached.org/ ) から開始します。人々はこのアプローチをLoad Aheadと呼んでいます。

有効期限と優先順位を指定して asp.net キャッシュを使用する場合、メモリ問題になることがあります。このような場合、メモリに問題が発生すると、いつでもキャッシュがなくなる可能性があります。したがって、必要に応じてデータを再度ロードします (ロード スルーと呼ばれます)。) 帯域幅に影響します。そのような場合、あなたのコードはうまくやっていくためにもっと賢くあるべきです。これが可能な場合は、できるだけキャッシュを少なくしてください。たとえば、読み込まれたアイテムをそれぞれキャッシュし、ユーザーがフィードを要求したときに、すべてのアイテムがキャッシュに存在するかどうかを確認します。そうでない場合は、すべてまたは不足しているものを再度取得する必要があります。過去に似たようなことをしたことがありますが、コードを提供できません。重要なポイントは、エンティティをキャッシュしてから、エンティティへの参照 (ID) を含むフィードをキャッシュすることです。したがって、特定のフィードが要求されたときに、すべての参照がキャッシュ内で有効であることを確認します。ところで、asp.net はそのようなシナリオのキャッシュ依存関係を提供するので、それについても読んでください - 役立つかもしれません。

いずれにせよ、データ アクセス レイヤーを実装するときは、Decoratorの設計パターンを念頭に置いてください。これにより、次のことが可能になります。1 - 後の開発フェーズのためにキャッシュの問題を延期し、2 - 状況に応じて上記の 2 つのアプローチを切り替えます。単純な (そして安価な) ビルトイン ソリューションから始めて、本当に必要になったときに分散キャッシュ ソリューションに切り替えます。

于 2013-02-14T18:26:16.793 に答える
1

一般的なフィードをキャッシュすることを検討し、それらにタグを付けましたか。そして、ユーザーごとに、そのタグ/キーワードへの参照を保存するだけです。

もう 1 つの可能性は、一般的なフィードを保存してから、クライアントでフィルター処理することです。これにより帯域幅が増加しますが、キャッシュのコストを節約できます。

また、HTML5 を使用している場合は、ローカル ストレージを使用してユーザー設定を保持します。

于 2013-02-12T12:46:40.497 に答える