ASP.NET缓存 - Remove(“key”)不起作用的情况?

时间:2009-06-02 22:29:35

标签: asp.net caching

我有一个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来检索对象,尽管我正在处理上下文。

4 个答案:

答案 0 :(得分:1)

我会要求您确保没有多个生产服务器用于负载平衡。在这种情况下,您必须使用一些外部依赖关系体系结构来使缓存项无效/删除。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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