12

基本的に単なる一連の Web サービスである ASP.NET MVC 3 アプリがあります。これらの Web サービスは、一連のコントローラー アクションによって公開されます。各コントローラー アクションは、データベースにクエリを実行します。私のデータはめったに変更されず、古いデータは問題にならないため、パフォーマンスを向上させるためにキャッシュを実装すると考えました。私の目標は次のとおりです。

  1. ユーザーへの応答を決してキャッシュしないでください。
  2. データベース レコードを最大 24 時間キャッシュします。24 時間が経過した場合は、データベースに再度アクセスします。

それは理にかなっていますか?応答がキャッシュされないようにする方法を知っています。私は次のものを使用します:

HttpContext.Response.Cache.SetCacheability(cacheability)

ただし、データベース レコードを最大 24 時間メモリにキャッシュする方法がわかりません。これを行う方法について何か提案はありますか?どこを見ればいいのかもわかりません。

ありがとうございました

4

5 に答える 5

8

System.Runtime.Caching名前空間 (または ASP.NET キャッシュですが、これは古く、Web アプリケーション内でのみ使用できます) を使用できます。

これは、現在のデータ取得メカニズムをラップするために使用できるサンプル関数です。MemoryCache.Add のパラメーターを変更して、キャッシュされる量を制御できますが、上記で 24h を要求しました。

using System.Runtime.Caching;    // At top of file

public IEnumerable<MyDataObject> GetData() 
{
    IEnumerable<MyDataObject> data = MemoryCache.Default.Get(MYCACHEKEY) as IEnumerable<MyDataObject>;
    if (data == null)
    {
        data = // actually get your data from the database here
        MemoryCache.Default.Add(MYCACHEKEY, data, DateTimeOffset.Now.AddHours(24));
    }
    return data;
}

@Bond が述べたように、キャッシュしているデータが 24 時間以内に変更される可能性がある場合は、SQL キャッシュ依存関係の使用を検討することもできます。ただし、かなり静的な場合、これはあなたが求めたとおりになります。

于 2012-06-14T14:51:29.727 に答える
2

あなたが話しているのは、MVCの責任ではありません。ASP.Netを使用すると、ASP.Netが生成するものだけを処理できます(これは明らかに応答です)。

データをキャッシュしたい場合は、データが生成されたのと同じ場所(BLまたはデータ層のどこか)にキャッシュする方がよい場合があります。

あなたはそのようなことをすることができます:

public class DataCacher
{
    private static String data;
    private static DateTime updateTime;

    private DataCacher() { }

    public static String Data
    {
        get
        {
            if (data == null || updateTime > DateTime.Now)
            {
                data = "Insert method that requests your data form DB here: GetData()";
                updateTime = DateTime.Now.AddDays(1);
            }
            return data;
        }
    }
}

String dataここに実際のデータを表示します。GetData()このクラスを追加した後、メソッドを。に置き換えますDataCacher.Data

それがあなたを助けてくれるか、少なくともあなたをさらなる思考に導くことを願っています。

于 2012-06-14T14:44:01.177 に答える
2

MVC フレームワークは永続性に依存しません。データを格納する組み込みの手段がないため、格納されたデータをキャッシュする組み込みの手段はありません。

このOutputCache属性を使用して、サーバーの応答をキャッシュできます。しかし、それはあなたがやりたいことではないことを明確に述べました。

OutputCacheただし、 MVC フレームワーク内に留まりたい場合は、ビルトインを引き続き使用できる場合があります。キャッシュしたいデータを JSON の結果として公開することを検討してください

[OutputCache(Duration = 86400)]
public JsonResult GetMyData() {
    var results = QueryResults();
    return Json(results);
}

の JSON 文字列は/ControllerName/GetMyData24 時間キャッシュされるため、実際のクエリは 1 日に 1 回だけ実行されます。つまり、最終ページに AJAX 呼び出しを実装するか、サーバーから別の HTTP 呼び出しを行う必要があります。どちらも理想的ではありません。

MVC フレームワークの外で、あなたの問題に対する別の解決策を探します。まさにこの目的のために作成されたmemcachedを考えてみましょう。

于 2012-06-14T13:49:50.680 に答える
1

MSSQLを使用している場合は、SQLキャッシュの依存関係を確認することをお勧めします。

キャッシュの有効期限を24時間に設定できるかどうかはわかりませんが、キャッシュの依存関係がある場合は、設定する必要がない場合があります。データベースが更新されるとすぐにキャッシュが無効になります(つまり、有効期限よりも効率的である必要があります)。ストラテジー)。

于 2012-06-14T13:58:26.173 に答える
0

これは、ASP.NET MVC 3のパフォーマンスに関連するいくつかのプラクティスについて説明している優れた記事であり、キャッシングについて説明しています。

于 2012-06-14T13:23:19.360 に答える