页面刷新后的HttpContext.Current.Cache项目为null

use*_*060 6 c# caching web

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

大多数情况下为空。并非总是如此,但几乎总是如此。

ist*_*iuk 5

即使使用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或更短,以避免任何用户访问空的缓存。


Jas*_*ong 2

你可以用它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)