列出<t>缓存(安全操作)</t>

时间:2010-12-02 11:40:47

标签: asp.net asp.net-mvc caching locking thread-safety

我正在使用asp.net mvc开发一个Web应用程序。

我在Cache中有一个List(我的模型的产品类列表)。所以,我在这个缓存列表上做了CRUD操作。我知道HttpContext.Current.Cache是​​typeSafe但列表没有。我想知道,为避免冲突,我的操作最好的方法是线程安全吗?

我的代码是这样的:

public static class ProjectCached {
    const string key = "ProductList";
    // my cached list
    public static IList<Product> Products {
       get {
           if (HttpContext.Current.Cache[key] == null) {
              HttpContext.Current.Cache.Insert(key, /* get data from database */, ...);
           }
           return (List<Product>)HttpContext.Current.Cache[key];
       }
    }
    // my methods (operations on cached list)
    public static void Increase(long id) {
        var item = Products.FirstOrDefault(x => x.Id == id);
        if (item != null) {
          item.Prince += 1;
          item.LastUpdate = DateTime.Now;
        }       
    }

    public static void Remove(long id) {
        var item = Products.FirstOrDefault(x => x.Id == id);
        if (item != null) {
            Products.Remove(item);
        }       
    }
    // others methods 

}

我会有很多用户同时在这个缓存列表上写...

我知道我可以使用“锁定”关键字但是我需要把它放在哪里?在我的对象上找到了吗?在我的名单上?

感谢

2 个答案:

答案 0 :(得分:1)

考虑使用IDictionary而不是list,例如SortedList<TKey, TValue>
关于安全线程:您可以使用

  1. lock关键字

  2. ReaderWriterLockSlim - 仅在需要时锁定

  3. ConcurrentDictionary<TKey, TValue> - 如果在其中实现了线程安全就足够了。

  4. UPD:ReaderWriterLockSlim比简单lock关键字更先进。使用ReaderWriterLockSlim允许许多读者在没有锁的情况下同时获取数据。但是当某个线程尝试写入数据时,所有其他线程都将被锁定并进行读写。

答案 1 :(得分:0)

您必须先锁定它才能搜索该项目。

private Object syncObject = new Object();

public static void Increase(long id) {        
    lock(syncObject) {
        ...    
    }
}

public static void Remove(long id) {        
    lock(syncObject) {
        ...    
    }
}