0

私の AppStart.cshtml では、データベースからいくつかのデータをフェッチし、計算を行い、json 文字列をシリアル化/逆シリアル化します。次のようなことを行って、結果をいくつかの AppState 変数に保存します:(C#)

AppState["myVar1"]="aString";
AppState["myVar2"]=anArray;

これらの変数は頻繁にアクセスされ、定義するのは少し重いので、必要になるたびにゼロからデータを作成するよりも、このような方が理にかなっていると思いました。最適化が必要ない場合でも、そのデータが必要な場所に同じコードを配置しないことで、読みやすさと確実に保守性が向上するため、私には理にかなっています。

同様に、ユーザーがログインするたびにセッションにデータを入れることで、ユーザーごとに同様のアクションを実行します。

Session["userVar1"]="myString";
Session["userVar2"]=myAray;

ただし、これらに保存されているデータは、クリアされた可能性のあるサーバーメモリに保存されているため、読み取りたいときにまだ存在することに決して依存してはならないことを読みました。これは本当ですか?では、これらのいずれかにアクセスしたいときは、最初にそれが null かどうかを確認する必要がありますか? 運が良ければ null ではなく、すぐに使用できますが、運が良ければ再度設定します。これは、AppState と Session に格納されたデータが使用されることになっている方法ですか? もしそうなら、それらがnullの場合、それらを再設定する良い方法は何でしょうか? それらがnullの場合にそれらを設定する関数を作成するようなことをしていると思いますか?

4

1 に答える 1

1

あなたの場合、サーバーによってデータが時々消去されても問題ないように思えます (たとえば、IIS からアプリ プロセスを再起動するなど)。説明したことは単なるキャッシュ シナリオであるためです。キャッシュ データは本質的に一時的なものです。あるなら使ってください。そこにない場合は、再度フェッチします (そして、キャッシュに結果を再度入力します)。

私がお勧めするのは、キャッシュ自体の構造からキャッシュ メカニズム (アプリの状態とセッションの状態) を抽象化することです。この構造内で、データがキャッシュされているかどうかを確認し、キャッシュされていない場合は再キャッシュできます。次のようなオブジェクトを考えてみましょう:

public class CacheManager
{
    public static string MyString
    {
        get
        {
            if (string.IsNullOrWhiteSpace(AppState["myVar1"]))
            {
                // Fetch the value to be cached and set it in AppState["myVar1"]
            }
            return AppState["myVar1"];
        }
    }
}

アプリケーションのどこでも、次のように呼び出して値を取得できます。

CacheManager.MyString

アプリケーションの残りの部分は、それがアプリの状態、セッションの状態、データベース、ファイル、またはキャッシュされたデータのその他の一時的な場所からのものかどうかを知りません。これは、キャッシュ マネージャー オブジェクトによって完全に処理されます。したがって、特定の値が配置されている場所を変更したい場合は、その場所で変更します。または、テスト目的で、キャッシュを完全に削除して常にデータを有効にしたい場合は、キャッシュ マネージャーの実装を、常に再フェッチされたデータを返すものに交換します。アプリケーションの残りの部分は、幸いなことに実装を認識していません。

于 2013-04-17T14:27:07.263 に答える