并发SortedList或O(log n)并发集合

时间:2014-03-20 22:56:27

标签: c# .net asp.net-mvc caching

我需要在ASP.NET MVC应用程序中缓存来自数据库的大量数据,并希望使用SortedList。我知道.NET 4.0添加了并发集合,但没有排序集合。 我当时正在考虑使用SynchronizedCollection,但是即使是读取它也是密集使用锁(如果我没有记错的话),所以我正在寻找其他选项。基本上我需要一个具有O(log n)访问复杂性的并发集合。

编辑 - 基于Greg回答的代码

void WrappedAdd(TKey k, TValue v)
{
  var copy = new SortedList<TKey, TValue>(_sortedList);
  copy.Add(k, v);
  _sortedList = copy;
}

1 个答案:

答案 0 :(得分:2)

你的要求很模糊,所以我真的不知道你想要什么。该集合是否应该编制索引?键值语义?

我不确定这是否符合您的要求,但您可以使用新的Microsoft immutable collections library。它目前在NuGet上作为预览版提供。它包含已排序的集合(排序集和字典)等。

这些集合本身并不是并发的(实际上,并发性不是问题;它们不能被修改)。但是,您可以通过包装它们并在写入期间使用锁定来在并发设置中使用它们。读取是线程安全的,因为唯一的突变是分配引用,这是一个原子操作,因此您可以保证获得最新的结果。

它们是基于树的,因此大多数操作都是log n

public class ConcurrentWrapper<TKey, T> {
    ImmutableSortedDictionary<TKey, T> _inner;

    public void Add(TKey key, T item) {
        lock (_inner) {
            _inner = _inner.Add(key, item);
        }
    }

    public T Get(TKey key) {
        return _inner[key];
    }
}