8

重複の可能性:
ASP.NET キャッシュの最大サイズ

asp.netキャッシング(フローコード)を使用して、かなり多くのデータテーブルをキャッシュしています:

HttpContext.Current.Cache.Insert(GlobalVars.Current.applicationID + "_" + cacheName, itemToCache, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(240));

ただし、サーバーのキャッシュがいっぱいになり、データベースからデータテーブル データを再取得する必要があると思いますサーバーにキャッシュできるデータの量や、微調整できる IIS 設定に制限はありますか?

4

3 に答える 3

13

制限をアップグレードする方法はありますが、他の種類のキャッシュ システムを使用することを強くお勧めします (これについては以下で詳しく説明します)。

.NET キャッシュ

.NET キャッシュの制限の詳細については、 Microsoft .NET チーム メンバーからのこの優れた回答をお読みください。

.NET キャッシュの現在の制限を確認したい場合は、次を試すことができます。

var r = new Dictionary<string, string>();

using (var pc = new PerformanceCounter("ASP.NET Applications", "Cache % Machine Memory Limit Used", true))
{
    pc.InstanceName = "__Total__";
    r.Add("Total_MachineMemoryUsed", String.Concat(pc.NextValue().ToString("N1"), "%"));
}
using (var pc = new PerformanceCounter("ASP.NET Applications", "Cache % Process Memory Limit Used", true))
{
    pc.InstanceName = "__Total__";
    r.Add("Total_ProcessMemoryUsed", String.Concat(pc.NextValue().ToString("N1"), "%"));
}
using (var pc = new PerformanceCounter("ASP.NET Applications", "Cache API Entries", true))
{
    pc.InstanceName = "__Total__";
    r.Add("Total_Entries", pc.NextValue().ToString("N0"));
}
using (var pc = new PerformanceCounter("ASP.NET Applications", "Cache API Misses", true))
{
    pc.InstanceName = "__Total__";
    r.Add("Total_Misses", pc.NextValue().ToString("N0"));
}
using (var pc = new PerformanceCounter("ASP.NET Applications", "Cache API Hit Ratio", true))
{
    pc.InstanceName = "__Total__";
    r.Add("Total_HitRatio", String.Concat(pc.NextValue().ToString("N1"), "%"));
}
using (var pc = new PerformanceCounter("ASP.NET Applications", "Cache API Trims", true))
{
    pc.InstanceName = "__Total__";
    r.Add("Total_Trims", pc.NextValue().ToString());
}

MemCached

私は現在Memcachedを使用しています。サイトをどこかでホストしている場合は、次のような有料サービスを使用できます。

または、独自のサーバーを使用している場合は、Couchbase Community Editionをダウンロードして、独自のサーバーをホストすることができます。

MemCache の使用に関する次のような質問がここにあります。

キャッシュシステム用のスペースを確保

コードを変更せずに他のキャッシュ システムを使用するには、次のようなインターフェイスの作成を採用できます。

public interface ICacheService
{
    T Get<T>(string cacheID, Func<T> getItemCallback) where T : class;
    void Clear();
}

次に、.NET キャッシュを使用している場合、実装は次のようになります

public class InMemoryCache : ICacheService
{
    private int minutes = 15;

    public T Get<T>(string cacheID, Func<T> getItemCallback) where T : class
    {
        T item = HttpRuntime.Cache.Get(cacheID) as T;
        if (item == null)
        {
            item = getItemCallback();
            HttpRuntime.Cache.Insert(
                cacheID,
                item,
                null,
                DateTime.Now.AddMinutes(minutes),
                System.Web.Caching.Cache.NoSlidingExpiration);
        }
        return item;
    }

    public void Clear()
    {
        IDictionaryEnumerator enumerator = HttpRuntime.Cache.GetEnumerator();

        while (enumerator.MoveNext())
            HttpRuntime.Cache.Remove(enumerator.Key.ToString());
    }
}

次のように使用します。

string cacheId = string.Concat("myinfo-", customer_id);
MyInfo model = cacheProvider.Get<MyInfo>(cacheId, () =>
{
    MyInfo info = db.GetMyStuff(customer_id);
    return info;
});

ICacheServiceMemcached を使用している場合は、IoC を使用するか、次のように直接呼び出して、必要なクラスを実装および選択する新しいクラスを作成するだけです。

private ICacheService cacheProvider;

protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
    if (cacheProvider == null) cacheProvider = new InMemoryCache();

    base.Initialize(requestContext);
}
于 2012-12-26T23:57:45.190 に答える
4

キャッシュは、ワーカー プロセスのメモリ割り当てを使用します。デフォルトでは、ワーカー プロセスはマシン メモリの 60% を使用して作業を行うことが許可されています。

リンクに従って、これを変更して、machine.config ファイルを編集することにより、より多くのマシン メモリをワーカー プロセスで使用できるようにすることができます。おそらく、データが古いことを検出したときに既に更新するようにキャッシュを構築しているため、これにより、より多くのオブジェクトをキャッシュに入れることができます。

于 2012-12-26T23:44:45.243 に答える
3

アイテムをキャッシュに挿入するときは、CacheItemRemovedCallback メソッドを追加します。

コールバック ログで、アイテムが削除された理由。このようにして、それがメモリ不足なのか、それとも何か他のものなのかがわかります。

public static void OnRemove(string key, 
   object cacheItem, 
   System.Web.Caching.CacheItemRemovedReason reason)
   {
      AppendLog("The cached value with key '" + key + 
            "' was removed from the cache.  Reason: " + 
            reason.ToString()); 
}

http://msdn.microsoft.com/en-us/library/aa478965.aspx

于 2012-12-26T23:46:40.033 に答える