c# - 页面刷新后 HttpContext.Current.Cache 项为空

标签 c# caching web

我有一个 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/

相关文章:

c# - 使用sqlserver 2005在特定位置插入值

c# - 更新到 EF 7.0.0-rc1-final 破坏了 SQL DbContextOptionsBuilder UseSqlServer

c# - AppFabric 缓存 - 它对对象的序列化和反序列化要求是什么?

c# - System.Runtime.Caching.MemoryCache 在被逐出时会处理 IDisposable 项目吗?

关于网格系统、媒体查询、响应式网页设计的 CSS 问题

web - 没有经验的人如何学习编程?

c# - 为什么我们不能在 if 语句中定义变量?

ruby-on-rails - 在初始化程序中设置 cache_store

javascript - 绕过观看多个视频的 6 次下载限制

c# - WithRequired() 没有定义扩展方法