【问题标题】:ASP.NET Cache - circumstances in which Remove("key") doesn't work?ASP.NET 缓存 - Remove("key") 不起作用的情况?
【发布时间】:2011-02-18 07:28:30
【问题描述】:

我有一个缓存一些业务对象的 ASP.NET 应用程序。保存新对象时,我在键上调用 remove 以清除对象。下次用户请求数据时,应该延迟加载新列表。

除非在不同客户端缓存的不同视图存在问题。

  • 两个用户正在浏览该网站
  • 用户 1 保存了一个新对象并删除了缓存
  • 用户 1 看到数据的最新视图
  • 用户 2 也在使用该站点,但在用户 1 保存新对象后由于某种原因看不到新的缓存数据 - 他们继续看到旧列表

这是代码的简化版本:

public static JobCollection JobList
{
    get
    {
        if (HttpRuntime.Cache["JobList"] == null)
        {
                GetAndCacheJobList();
        }
        return (JobCollection)HttpRuntime.Cache["JobList"];
    }
}

private static void GetAndCacheJobList()
    {
        using (DataContext context = new DataContext(ConnectionUtil.ConnectionString))
        {
            var query = from j in context.JobEntities
                        select j;
            JobCollection c = new JobCollection();
            foreach (JobEntity i in query)
            {
                Job newJob = new Job();
                ....
                c.Add(newJob);
            }
            HttpRuntime.Cache.Insert("JobList", c, null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Default, null);
        }
    }

public static void SaveJob(Job job, IDbConnection connection)
    {
        using (DataContext context = new DataContext(connection))
        {

               JobEntity ent = new JobEntity();
               ...
               context.JobEntities.InsertOnSubmit(ent);                
               context.SubmitChanges();
               HttpRuntime.Cache.Remove("JobList");                                     

        }
    }

有人知道为什么会发生这种情况吗?

编辑:我正在使用 Linq2SQL 检索对象,尽管我正在处理上下文。

【问题讨论】:

    标签: asp.net caching


    【解决方案1】:

    我会要求您确保您没有多个生产服务器来实现负载平衡。在这种情况下,您将不得不使用一些外部依赖架构来使缓存项无效/删除。

    【讨论】:

      【解决方案2】:

      那是因为您不同步缓存操作。您应该锁定将您的列表写入缓存(甚至可能将列表放入锁中)并同时将其从缓存中删除。否则,即使读取和写入是同步的,也没有什么可以阻止在调用 Remove 之后立即存储旧 List。如果您需要一些代码示例,请告诉我。

      【讨论】:

        【解决方案3】:

        如果您还没有检查过,我还会检查他们看到的旧数据是否没有以某种方式缓存在 ViewState 中。

        【讨论】:

          【解决方案4】:

          您必须确保用户 2 发送了新请求。也许它看到的内容来自浏览器的缓存,而不是来自您服务器的缓存

          【讨论】:

            猜你喜欢
            • 2012-06-03
            • 1970-01-01
            • 1970-01-01
            • 2012-03-02
            • 2011-08-19
            • 2016-11-08
            • 1970-01-01
            • 2016-09-26
            • 2012-01-25
            相关资源
            最近更新 更多