如果我锁定HttpContext.Current.Cache.Insert方法,是否有任何令人讨厌的副作用

时间:2010-05-04 03:39:39

标签: asp.net caching multithreading

除了阻止从缓存中读取其他线程时,我还应该考虑在为面向公众的网站锁定缓存插入方法时应该考虑的其他问题。

实际的数据检索和插入缓存应该不超过1秒,我们可以忍受。更重要的是,我不希望多个线程可能同时触及Insert方法。

示例代码如下所示:

public static readonly object _syncRoot = new object();

if (HttpContext.Current.Cache["key"] == null)
{
  lock (_syncRoot)
  {
    HttpContext.Current.Cache.Insert("key", "DATA", null, DateTime.Now.AddMinutes(5), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);
  }
}

  Response.Write(HttpContext.Current.Cache["key"]);

1 个答案:

答案 0 :(得分:2)

我希望您这样做是为了防止数据检索不止一次,可能是因为数据量很大,当多个用户触发检索时,这可能会对您的服务器产生影响。

Cache.Insert本身上的这样的锁是没用的,因为这种方法是线程安全的。像这样的锁对于防止双重数据检索很有用,但在这种情况下你应该考虑使用双重检查锁:

var  data = HttpContext.Current.Cache["key"];
if (data == null)
{
  lock (_syncRoot)
  {
    // Here, check again for null after the lock.
    var  data = HttpContext.Current.Cache["key"];
    if (data == null)
    {
        var data = [RETRIEVE DATA]
        HttpContext.Current.Cache.Insert("key", data, null, ...);
  }
}
return data;

但是对你的主要问题。除了长时间锁定的风险,导致Web应用程序出现大的延迟之外,没有什么可担心的:-)。单独锁定Cache.Insert,对你没有任何伤害。