我有一个网页,它缓存一些查询字符串值30秒,这样它就不会收到重复的值。我使用以下课程:
public class MyCache {
private static ObjectCache cache = MemoryCache.Default;
public MyCache() { }
public void Insert(string key, string value)
{
CacheItemPolicy policy = new CacheItemPolicy();
policy.Priority = CacheItemPriority.Default;
policy.SlidingExpiration = new TimeSpan(0, 0, 30);
policy.RemovedCallback = new CacheEntryRemovedCallback(this.Cacheremovedcallback);
cache.Set(key, value, policy);
}
public bool Exists(string key)
{
return cache.Contains(key);
}
public void Remove(string key)
{
cache.Remove(key);
}
private void Cacheremovedcallback(CacheEntryRemovedArguments arguments)
{
FileLog.LogToFile("Cache item removed. Reason: " + arguments.RemovedReason.ToString() + "; Item: [" + arguments.CacheItem.Key + ", " + arguments.CacheItem.Value.ToString() + "]");
}
}
这已经运行了好几个星期,然后突然缓存不再保留值。cacheRemoved回调在项目插入缓存后立即激发,我得到删除的原因:cacheSpecificEviction
它运行在Windows Server 2008 SP1、IIS7.5和.NET 4.0上。在此期间未对操作系统或IIS应用任何更改。
有办法解决这个问题吗?如果没有,在网页中是否有更好的缓存解决方案?
提前谢谢你。
最佳答案
查看MemoryCacheStore
的源代码(它应该是MemoryCache.Default
使用的默认存储),似乎只有在释放缓存时才会调用带有参数CacheSpecificEviction
的remove回调:
https://referencesource.microsoft.com/#System.Runtime.Caching/System/Caching/MemoryCacheStore.cs,230
环顾四周,确保不会意外释放缓存对象。