asp.net缓存限制? [重复](asp.net caching limit? [duplic

2019-07-17 14:20发布

可能重复:
ASP.NET缓存最大大小

我缓存了很多使用asp.net缓存(该floowing代码)的数据表:

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

但是我认为 ,在服务器上的高速缓存快满了,需要重新从数据库获取数据表的数据。 是否有任何限制,可以在服务器或可以调整任何IIS设置上缓存的数据量?

Answer 1:

有升级限制的方式,但我强烈建议您使用其他种类的缓存系统(更多相关信息如下)。

.NET缓存

要了解更多关于.NET缓存限制,请阅读这个伟大的答案从微软的.NET团队成员 。

如果你想看到.NET Cache的电流限制,你可以试试:

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的 ,如果你在某处托管你的网站,你可以使用付费服务,如:

  • http://www.memcachier.com/

或者,如果你使用自己的服务器,你可以下载Couchbase社区版和托管我们自己。

您将在这里找到更多的问题有关使用内存缓存,如:

  • 其.NET的memcached客户端,你用,EnyimMemcached与BeITMemcached?
  • 如何开始使用memcached的

腾出空间给任何缓存系统

要使用其他缓存系统,而无需更改代码,你可以通过创建一个接口,像

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;
});

如果你正在使用Memcached的,所有你需要做的就是创建实现一个新的类ICacheService ,无论是使用的IoC或直接打电话的,并选择您想要的类:

private ICacheService cacheProvider;

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

    base.Initialize(requestContext);
}


Answer 2:

当插入一个项目到缓存中添加一个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



Answer 3:

高速缓存使用工作进程的内存分配。 默认情况下,工作进程被允许获得本机内存的60% ,以完成其工作。

按照该链接,这是可以改变的,以让更多的机器内存的通过编辑machine.config文件中使用的工作进程。 想必你已经建立,当它检测到的数据是过时的已更新缓存,所以这应该让你把更多的对象到缓存。



文章来源: asp.net caching limit? [duplicate]