我有一个 C# 网页,我在其中使用 HttpContext.Current.Cache 在服务器缓存中存储一个 List<> 对象。该对象在第一次页面加载后保存在缓存中。但是,当我刷新页面时,缓存对象为空。有什么想法吗?
此外,我想设置一个“作业”以每 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() 以防止这种情况发生。 Lookup CachéItemPriority on MSDN.
IIS 应用程序池因长时间空闲、web.config/binary 更改等而重新启动,也会删除您的缓存。检查this other SO post, HttpRuntime.Cache.Insert() Not holding cached value
关于创建刷新缓存的作业;我认为最佳缓存策略没有经验法则。这在很大程度上取决于您的用户与您的网页交互的方式、频率、并发程度,特别是在未命中缓存时生成该数据需要多少时间。
如果生成数据所花费的时间对于任何用户来说都是 Not Acceptable ,您可以设置一个刷新缓存的作业,但它的间隔应该小于缓存 TTL + 生成/检索所花费时间的总和. 例如,如果您的缓存为 30m,生成数据需要 2m,则刷新间隔必须为 28m 或更短,以避免任何用户访问空缓存。
关于c# - 页面刷新后 HttpContext.Current.Cache 项为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14421744/