6

HttpContext.Current.Cache を使用して、List<> オブジェクトをサーバー キャッシュに格納する C# Web ページがあります。オブジェクトは、最初のページの読み込み後にキャッシュに保存されます。ただし、ページを更新すると、キャッシュ オブジェクトは null です。何かご意見は?

また、オブジェクトを 30 分ごとに再作成する「ジョブ」を設定したいと思います。新しいものが作成されるまでキャッシュされたバージョンを提供し、古いものを新しいものに置き換えたいと思います。それ、どうやったら出来るの?

Global.asax の Application_Start には、次のものがあります。

HttpRuntime.Cache.Insert("MainADList", Uf.GetUsers(), null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(30));

必要なときは、次のことを行います。

 MainADList = (Users)HttpRuntime.Cache["MainADList"];

ほとんどの場合、これは null です。常にではありませんが、ほぼ常にです。

4

2 に答える 2

5

Cache.NoAbsoluteExpiration+を使用してキャッシュにデータを入力した場合でもCache.NoSlidingExpiration、ASP.NET はキャッシュから項目を削除できます (つまり、空きシステム メモリが少ない場合)。

CacheItemPriority.NotRemovableそれが起こらないようにするには、Cache.Insert() に渡します。MSDN で CachéItemPriority を参照してください。

長いアイドル時間、web.config/binary の変更などによる IIS アプリケーション プールの再起動によっても、キャッシュが消去されます。この他のSO投稿、HttpRuntime.Cache.Insert()キャッシュされた値を保持していないことを確認してください

キャッシュを更新するジョブの作成について。最適なキャッシュ戦略の経験則はないと思います。これは、ユーザーが Web ページをどのように操作するか、キャッシュがヒットしていない場合にそのデータを生成するのにどれくらいの頻度、同時性、および特にどのくらいの時間がかかるかに大きく依存します。

データの生成にかかる時間がどのユーザーにも受け入れられない場合は、キャッシュを更新するジョブを設定できますが、その間隔は、キャッシュの TTL + 生成/取得にかかる時間の合計よりも短くする必要があります。たとえば、キャッシュが 30 分で、データの生成に 2 分かかる場合、ユーザーが空のキャッシュにヒットしないように、更新間隔を 28 分以下にする必要があります。

于 2013-01-29T12:28:44.600 に答える
2

System.Runtime.Cachingを代わりに使用できますか。そうすれば、HttpRuntime 名前空間に依存しなくなります。

Webサーバーの再起動により.Netがクリアしているため、nullになっていると思われます。の線に沿って何かをした方が良いでしょうか?

    public List<User> GetUsers()
    {
        var cache = System.Runtime.Caching.MemoryCache.Default;
        if (cache["MainADList"] == null)
        {
            // Rebuild cache. Perhaps for Multithreading, you can do object locking
            var cachePolicy = new System.Runtime.Caching.CacheItemPolicy() { AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(30) };
            var users = Uf.GetUsers();
            cache.Add(new System.Runtime.Caching.CacheItem("MainADList", users), cachePolicy);

            return users;
        }

        return cache["MainADList"] as List<User>; 
    }
于 2013-01-24T04:39:32.297 に答える