页面刷新后,HttpContext.Current.Cache项为空

本文关键字:Cache Current HttpContext 刷新 | 更新日期: 2023-09-27 17:54:46

我有一个c#网页,我在服务器缓存中存储一个列表<>对象,使用HttpContext.Current.Cache。对象在第一个页面加载后保存在缓存中。但是,当我刷新页面时,缓存对象为空。任何想法吗?

另外,我想设置一个"作业",每30分钟重新创建一个对象。我想提供缓存的版本,直到新的创建,然后用新的替换旧的。我怎么做呢?

在我的全局。在Application_Start中,我有以下内容:

HttpRuntime.Cache.Insert("MainADList", Uf.GetUsers(), null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(30));

当我需要它时,我做以下事情:

 MainADList = (Users)HttpRuntime.Cache["MainADList"];

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

页面刷新后,HttpContext.Current.Cache项为空

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

CacheItemPriority.NotRemovable传递给Cache.Insert()以防止发生这种情况。

在MSDN上查找cach itempriority。

IIS应用程序池因长时间空闲而重启,web。配置/二进制更改等也会擦除缓存。检查其他SO post, httprtime . cache . insert()没有保存缓存值

关于创建一个job来刷新cache;我不认为最好的缓存策略有一个经验法则。这在很大程度上取决于你的用户如何与你的网页交互,频率,并发度,特别是,当缓存未被击中时,生成数据需要多少时间。

如果生成数据的时间对于任何用户来说都是不可接受的,那么您可以设置一个刷新缓存的作业,但是它的间隔应该小于缓存TTL +生成/检索所需的时间之和。例如,如果您的缓存是30m,而生成数据需要2m,那么刷新间隔必须为28m或更短,以避免任何用户碰到空缓存。

可以用System.Runtime.Caching代替吗?这样,您就不依赖于HttpRuntime名称空间。

我怀疑你得到null,因为。net正在清除它由于web服务器重启。按照

这一行来写会不会更好?
    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>; 
    }