6

我有一个 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"];

这在很大程度上是空的。并非总是如此,但几乎总是如此。

4

2 回答 2

5

即使您使用Cache.NoAbsoluteExpiration+填充缓存Cache.NoSlidingExpiration,ASP.NET 也可以从缓存中删除项目(即:当可用系统内存不足时)。

传递CacheItemPriority.NotRemovable给 Cache.Insert() 以防止这种情况发生。在 MSDN 上查找 CachéItemPriority。

IIS 应用程序池因长时间空闲、web.config/binary 更改等而重新启动也会擦除您的缓存。检查此其他 SO 帖子, HttpRuntime.Cache.Insert() 不保存缓存值

关于创建作业刷新缓存;我认为最好的缓存策略没有经验法则。这在很大程度上取决于您的用户与您的网页交互的方式、频率、并发程度,特别是在未命中缓存时生成该数据需要多长时间。

如果任何用户都无法接受生成数据所花费的时间,您可以设置一个刷新缓存的作业,但它的时间间隔应小于缓存 TTL + 生成/检索所用时间的总和。例如,如果您的缓存为 30m,而生成数据需要 2m,则您的刷新间隔必须为 28m 或更少,以避免任何用户命中空缓存。

于 2013-01-29T12:28:44.600 回答
2

你可以用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>; 
    }
于 2013-01-24T04:39:32.297 回答