2013-06-24 63 views
3

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

示例代码如下

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

我们有一个功能,这使我们的产品列表中BLL

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

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

我想在这里多加一个局面,让说,我用静态对象而不是缓存对象,那么会发生什么,以及哪种方法最好,如果我们在一个独立的服务器上,而不是群集上

+2

无论哪种方式,它取决于将检索您的数据的代码。 15分钟后,缓存将简单地为“产品”关键字返回null。静态对象将无法在应用程序池回收中生存,所以在这种情况下,它也将依赖于将从静态对象中检索数据的代码。 –

+0

此外,您还需要在两种情况下都使用线程安全集合。请参阅[System.Collections.Concurrent命名空间](http://msdn.microsoft.com/en-us/library/system.collections.concurrent.aspx) – Magnus

+0

你可以给我链接到这个东西实现的例子 – rajansoft1

回答

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. 活动缓存
  2. 备份缓存 - 这是将要更新
  3. 缓存控制器的一个,这将表明哪些对象是活动

所以过程(另一个缓存对象?)更新将

  1. 更新备份缓存
  2. 有限公司mpletes。检查有效
  3. 备份变为活动状态,反之亦然。该控件现在将备份缓存标记为处于活动状态

需要有一种方法在产品缓存对象填充时触发。我可能会使用CacheItemRemoveCallback委托启动缓存重新填充。还是在门面型类的异步调用 - 你不希望它阻止当前线程

我敢肯定有这个

EDIT 2

的许多其他变体其实思考关于这我会让控制器类是这样的

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

该状态将是积极的,备份,更新,也许无效和错误。您可以在发生更新时设置IsUpdating标志,并在完成时返回false以停止尝试一次更新的多个线程 - 即竞争条件。该类只是一个普遍的原则,可以/应该根据需要进行修改。

+0

高速缓存刷新的时间如何? – rajansoft1

+3

竞争条件意味着您有可能(尽管可能不太可能)将缓存项目从“Cache.Insert(key,...)”和“return Cache [key]”之间驱逐出去。使用一个局部变量来保证你不会返回null。 – Joe

+0

谢谢你 - 使用回调委托或使用备份缓存方法会是真的吗?这只是第一个(只有?!?)代码示例中的问题吗? –