可能重复:
ASP.NET缓存最大大小
我缓存了很多使用asp.net缓存(该floowing代码)的数据表:
HttpContext.Current.Cache.Insert(GlobalVars.Current.applicationID + "_" + cacheName, itemToCache, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(240));
但是我认为 ,在服务器上的高速缓存快满了,需要重新从数据库获取数据表的数据。 是否有任何限制,可以在服务器或可以调整任何IIS设置上缓存的数据量?
有升级限制的方式,但我强烈建议您使用其他种类的缓存系统(更多相关信息如下)。
.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);
}
当插入一个项目到缓存中添加一个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
高速缓存使用工作进程的内存分配。 默认情况下,工作进程被允许获得本机内存的60% ,以完成其工作。
按照该链接,这是可以改变的,以让更多的机器内存的通过编辑machine.config文件中使用的工作进程。 想必你已经建立,当它检测到的数据是过时的已更新缓存,所以这应该让你把更多的对象到缓存。