我有一个C#网页中,我存储在服务器高速缓存一个List <>对象,使用HttpContext.Current.Cache。 对象是第一页面加载后保存在缓存中。 当我刷新页面,虽然,缓存对象为null。 有什么想法吗?
另外,我想成立一个“工作”来重建对象每隔30分钟。 我想就可以提供缓存的版本,直到创建了新的,然后用新的取代旧的。 我怎么做?
在我的Global.asax中的Application_Start,我有以下:
HttpRuntime.Cache.Insert("MainADList", Uf.GetUsers(), null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(30));
当我需要它,我做到以下几点:
MainADList = (Users)HttpRuntime.Cache["MainADList"];
这是大部分空。 并非总是如此,但几乎总是。
即使你使用填充缓存Cache.NoAbsoluteExpiration
+ Cache.NoSlidingExpiration
,ASP.NET可以从缓存中删除项目(即:当免费的系统内存不足)。
通过CacheItemPriority.NotRemovable
到Cache.Insert()来防止这种情况发生。 MSDN上查找CachéItemPriority。
长的空闲时间,web.config文件/二元变化等的IIS应用程序池重启也将清除您的缓存。 检查这个其他SO后,HttpRuntime.Cache.Insert()不举行缓存值
关于创建工作,以刷新缓存; 我不认为有经验的最佳缓存策略的规则。 这将在很大程度上取决于用户如何与你的网页,多长时间,怎么并发,而特别,有多少时间没有考虑到产生这些数据时,高速缓存未命中互动。
如果需要生成数据的时间是不能接受的任何用户,您可以设置刷新缓存中的工作,但它的时间间隔应小于缓存TTL +时间的生成/检索需要的总和。 例如,如果你的缓存为30m,它需要2μm至生成的数据,您的刷新间隔必须28米以下,以避免任何用户打一个空的缓存。
你可以使用System.Runtime.Caching
代替。 这样,你不依赖的httpRuntime命名空间。
我怀疑你要空,因为.NET是将其清除由于网络服务器重新启动。 它会更好做沿东西线
public List<User> GetUsers()
{
var cache = System.Runtime.Caching.MemoryCache.Default;
if (cache["MainADList"] == null)
{
// Rebuild cache. Perhaps for Multithreading, you can do object locking
var cachePolicy = new System.Runtime.Caching.CacheItemPolicy() { AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(30) };
var users = Uf.GetUsers();
cache.Add(new System.Runtime.Caching.CacheItem("MainADList", users), cachePolicy);
return users;
}
return cache["MainADList"] as List<User>;
}