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;
}
你的要求很模糊,所以我真的不知道你想要什么。集合应该有索引吗?键-值语义?
我不确定这是否符合您的要求,但是您可以使用新的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];
}
}