Concurrent SortedList or O(log n) concurrent collection

本文关键字:concurrent collection log SortedList or Concurrent | 更新日期: 2023-09-27 17:51:12

我需要缓存大量的数据从数据库在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;
}

Concurrent SortedList or O(log n) concurrent collection

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

我不确定这是否符合您的要求,但是您可以使用新的Microsoft不可变集合库。它目前在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];
    }
}