在asp.net中管理缓存对象

时间:2013-06-24 11:14:05

标签: c# asp.net caching

我有一个存储在asp.net缓存中的产品列表,但我在刷新缓存时遇到问题。根据我们的要求,我想每15分钟刷新一次缓存,但我想知道,如果在某个用户要求提供产品列表的同时刷新缓存的平均时间,那么他应该得到错误或旧列表,或者他有等到缓存刷新。

示例代码在

下面
public class Product
{
    public int Id{get;set;}
    public string Name{get;set;}
}

我们有一个函数,它给出了BLL中的Product列表

public List<Product> Products()
{
       //////some code
}

Cache.Insert("Products", Products(), null, DateTime.Now.AddMinutes(15), TimeSpan.Zero);

我想在这里再添加一个情况,假设我使用静态对象而不是缓存对象然后会发生什么,如果我们在独立服务器上而不是在集群上,哪种方法最好

1 个答案:

答案 0 :(得分:3)

抱歉 - 这可能是天真/明显的,但只有一个外观类型类

if(Cache["Products"] == null)
{
        Cache.Insert("Products", Products(), null, DateTime.Now.AddMinutes(15), TimeSpan.Zero);
 }
 return Cache["Products"];

还有一个CacheItemRemoveCallback委托,您可以使用它来重新填充过期的缓存。作为替代

另外

使用缓存对象而不是静态对象。显然更有效(Asp.net - Caching vs Static Variable for storing a Dictionary)并获得所有缓存管理方法(滑动到期等)

修改

如果担心更新时间,请考虑两个缓存对象和一个控制器,例如

  1. Active Cache
  2. 备份缓存 - 这是将要更新的缓存
  3. 缓存控制器(另一个缓存对象?)这将指示哪个对象处于活动状态
  4. 所以更新的过程将是

    1. 更新备份缓存
    2. 结束。检查有效
    3. 备份变为活动状态,反之亦然。控件现在将备份缓存标记为活动
    4. 需要有一个方法,在填充产品缓存对象时将触发。我可能会使用CacheItemRemoveCallback委托来启动缓存重新填充。或者在外观类型类中执行异步调用 - 您不希望它阻止当前线程

      我确信这个

      还有很多其他变种

      编辑2

      实际上考虑这个我会使控制器类像这样

      public class CacheController
      {
          public StateEnum Cache1State {get;set;}
          public StateEnum Cache1State {get;set;}
          public bool IsUpdating {get;set;}
      }
      

      状态将是活动的,备份的,更新的,也许是非活动的和错误的。您将在更新发生时设置IsUpdating标志,然后在完成后返回false以停止多个线程尝试立即更新 - 即竞争条件。该课程只是一般原则,可以/应该根据需要进行修改