20

カテゴリ内の製品のページリストを使用した、かなり標準的なeコマースシナリオがあります。良くも悪くも、訪問者の約80%が最初のページを超えてナビゲートすることはありません。カテゴリによっては、表示される頻度がはるかに少ない結果のページが5〜10ページ増える可能性があります。(はい、最初のページに表示されるものを最適化し、適切な検索を行いますが、それは別の議論です)

メモリに制約があるため、結果のすべてのページをキャッシュすることはできませんが、各カテゴリの結果の最初のページだけをキャッシュすることの利点は非常に大きくなります。

オブジェクトキャッシングを使用して問題のデータセットを保存するのと同様のことができることは知っていますが、これは出力キャッシングを使用して、おそらくresponse.Cacheオブジェクトを使用して可能ですか?

ページのライフサイクルのどこでこれを行うことができますか?事前レンダリング?

非常に単純化すると、URLは「/ ProductList?Category = something&Page = 1」のようなものになります。(擬似コード)のようなロジックが必要です。

If paramater "Page" equals 1
   Use output caching: vary by param = "categoryName; page"
else
   Don't use caching at all, just render the page from scratch.

IIS 6/win2003でASP.NET2.0を使用しています。

4

5 に答える 5

31

OutputCacheディレクティブを使用する代わりに、次のようにプログラムで同じことを行うことができます。

if (yourArbitraryCondition) {
  OutputCacheParameters outputCacheSettings = new OutputCacheParameters();
  outputCacheSettings.Duration = 60;
  InitOutputCache(outputCacheSettings);
}

OnInitからこれを行うと、正常に機能するはずです。そして明らかに、OutputCacheParameterにさまざまなプロパティを設定することで、キャッシュの動作を微調整できます。このプロパティには、ディレクティブとすべて同じノブがあります(実際、ディレクティブを使用すると、これが生成されます)。

重要な点は、このロジックは条件付きでのみ実行しているのに対し、ディレクティブでは無条件で実行しているということです。

アップデート:

別の方法として、上記のコードが構築されている低レベルのキャッシュAPIを使用できます。例えば

HttpCachePolicy cache = Response.Cache;
cache.SetCacheability(HttpCacheability.Public);
cache.SetExpires(Context.Timestamp.AddSeconds(60));
cache.VaryByParams["categoryName"] = true;

基本的に、これは、「呼び出されるべきではない」とマークされたAPIを使用せずに、同じことを行う別の方法です。結局、どちらの方法でも機能するので、選択してください。

于 2009-12-31T07:21:23.003 に答える
5

編集: 私はDavidEbboの答えが自分の答えよりもずっと好きです。


あなたが使うことができます

<%@ OutputCache Duration="60"  VaryByParam="none" VaryByCustom="pageOne" %>

最初のページには固定キーを返し、他のすべてのページにはランダムキーを返すように実装します。スカベンジングメカニズムにメモリを処理させることができます(そしてそうすべきです)が、必要に応じてキャッシュアイテムを削除するために使用できます。HttpResponse.RemoveOutputCacheItem

public override string GetVaryByCustomString(HttpContext ctx, string custom)
{
    if(custom == "pageOne")
    {
        if(ctx.Request["page"] == "1")
        {
            return "1";
        }

        HttpResponse.RemoveOutputCacheItem("/Default.aspx");
        return Guid.NewGuid().ToString();
    }
    return base.GetVaryByCustomString(ctx, custom);
}
于 2009-12-30T22:21:23.903 に答える
4

これを行う最良の方法は、HttpCachePolicy.AddValidationCallbackを使用することだと思います

http://www.hanselman.com/blog/AdvancedASPNETCachingAndAddValidationCallBack.aspxを参照してください-この質問に正確に答える完全な例があります。

于 2012-05-17T20:00:14.950 に答える
1

あなたはまだoutputcacheディレクティブを使うことができます、そして私の意見では、あなたはあなたのページコードをたくさんのキャッシングの要点で散らかすよりも、Global.asaxでこれを通常の方法で扱うことに基づく再利用可能な解決策を使うほうが良いですVaryByCustomシナリオになります。

したがって、たとえば、リピーターでページングアプローチを使用している場合、検索シナリオで、特定のページのポストバックをキャッシュから除外したい場合があります。これはまさにそれを行うコード例です。このアプローチでは、キャッシュを回避したい基準をトラップした後、HttpContextオブジェクトを使用してResponse.Cache.SetNoServerCaching()にアクセスする必要があります。これがお役に立てば幸いです。

于 2015-06-12T19:55:54.313 に答える
0

出力キャッシュを変更するために使用される文字列のセミコロンで区切られたリストにVaryByParamプロパティを設定して、OutputCacheディレクティブを使用できるはずです。

Page == 1の場合にのみキャッシュしたい場合を除いて、

于 2009-06-25T12:45:44.057 に答える