我有一个存储在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);
我想在这里再添加一个情况,假设我使用静态对象而不是缓存对象然后会发生什么,如果我们在独立服务器上而不是在集群上,哪种方法最好
答案 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)并获得所有缓存管理方法(滑动到期等)
修改强>
如果担心更新时间,请考虑两个缓存对象和一个控制器,例如
所以更新的过程将是
需要有一个方法,在填充产品缓存对象时将触发。我可能会使用CacheItemRemoveCallback
委托来启动缓存重新填充。或者在外观类型类中执行异步调用 - 您不希望它阻止当前线程
我确信这个
还有很多其他变种编辑2
实际上考虑这个我会使控制器类像这样
public class CacheController
{
public StateEnum Cache1State {get;set;}
public StateEnum Cache1State {get;set;}
public bool IsUpdating {get;set;}
}
状态将是活动的,备份的,更新的,也许是非活动的和错误的。您将在更新发生时设置IsUpdating
标志,然后在完成后返回false以停止多个线程尝试立即更新 - 即竞争条件。该课程只是一般原则,可以/应该根据需要进行修改