我有一个C#网页,其中使用HttpContext.Current.Cache在服务器缓存中存储List <>对象。加载第一页后,对象将保存在缓存中。但是,当我刷新页面时,缓存对象为null。有什么想法吗?
另外,我想设置一个“作业”以每30分钟重新创建对象。我想提供缓存的版本,直到创建新版本为止,然后用新版本替换旧版本。我怎么做?
在我的Global.asax的Application_Start中,具有以下内容:
HttpRuntime.Cache.Insert("MainADList", Uf.GetUsers(), null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(30));
Run Code Online (Sandbox Code Playgroud)
需要时,请执行以下操作:
MainADList = (Users)HttpRuntime.Cache["MainADList"];
Run Code Online (Sandbox Code Playgroud)
大多数情况下为空。并非总是如此,但几乎总是如此。
即使使用Cache.NoAbsoluteExpiration+ 填充缓存Cache.NoSlidingExpiration,ASP.NET也可以从缓存中删除项目(即:当可用系统内存不足时)。
传递CacheItemPriority.NotRemovable给Cache.Insert()以防止这种情况发生。在MSDN上查找CachéItemPriority。
IIS应用程序池由于长时间的空闲时间,web.config / binary更改等而重新启动,也会清除缓存。检查此其他SO帖子HttpRuntime.Cache.Insert()不保存缓存的值
关于创建作业以刷新缓存;我认为最好的Cache策略没有经验法则。这将在很大程度上取决于您的用户与您的网页的交互方式,多长时间,并发,特别是在未命中缓存时生成数据所需的时间。
如果对于任何用户来说,生成数据所花费的时间都是不可接受的,则可以设置一个刷新缓存的作业,但是其间隔应小于缓存TTL +生成/检索所用时间的总和。例如,如果您的缓存为30m,而生成数据需要2m,则刷新间隔必须为28m或更短,以避免任何用户访问空的缓存。
你可以用它System.Runtime.Caching来代替吗?这样您就不再依赖于 HttpRuntime 命名空间。
我怀疑你得到 null 因为 .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>;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5429 次 |
| 最近记录: |