我正在测试System.Runtime.Caching.MemoryCache
,看看它是如何工作的。
我创建了一个缓存,如下所示:
NameValueCollection config = new NameValueCollection();
config.Add("cacheMemoryLimitMegabytes", Convert.ToString(250));
config.Add("pollingInterval", Convert.ToString("00:00:17"));
config.Add("physicalMemoryLimitPercentage", Convert.ToString(2));
_m_memoryCacheToUse = new MemoryCache("MemCache",config);
我创建了一个测试网页,基本上我可以在缓存中指定大约1KB内存大小(1000字节数组)的项目数量。我的机器有12GB的RAM,目前的RAM使用率约为40%,这让我有很多内存可供使用。从上面的设置中,我应该使用250MB的ram,或者我物理内存的2%。出于某种原因,当我读取设置(cache.PhysicalMemoryLimit
)时,它显示3%而不是2%。 2%应该等于245MB,而3%应该等于368MB。
首先,我不确定它是如何工作的。 PhysicalMemoryLimit
的默认值为99%,而我的PC上的CacheMemoryLimitMegabytes
设置为7.8GB。所以我决定覆盖这两个设置。当你设置它们时我不知道它是如何工作的,所以我尝试了类似的值。
我在缓存中插入了50,000个项目,如下所示:
void btnGenerateCacheStressTest_Click(object sender, EventArgs e)
{
TimeSpan slidingExpiration = new TimeSpan(24, 1, 1, 1);
DateTimeOffset expirationDate = DateTimeOffset.MaxValue;
int itemsToGenerate = Convert.ToInt32(txtItemsToGenerate.Text);
var cache = MemCacheToUseToUse;
Random rnd = new Random();
for (int i = 0; i < itemsToGenerate; i++)
{
CacheItemPolicy policy = new CacheItemPolicy();
policy.Priority = CacheItemPriority.Default;
policy.RemovedCallback += CacheEntryRemovedCallback;
policy.SlidingExpiration = slidingExpiration;
policy.AbsoluteExpiration = expirationDate;
string regionName = null;
string rndKey = ("stressTest-Data-" + DateTime.Now.Ticks + "-" + i);
byte[] bytesArray = new byte[1000];
rnd.NextBytes(bytesArray);
cache.Add(rndKey, bytesArray, policy, regionName);
}
}
我使用NoSlidingExpiration
进行了实验,并定义了滑动过期。 50,000个项目应该相当于大约50-70MB我猜想会增加一些开销。这远远低于我允许缓存的256MB。然而,几秒钟后,CacheEntryRemovedCallback
被调用,缓存有时甚至只有1000个项目。 RemovedReason
为Evicted
,MSDN所说的是{http://msdn.microsoft.com/en-us/library/system.runtime.caching.cacheentryremovedreason(v=vs.110).aspx)
它不应该接近这样的限制。他们为什么被驱逐?