我试图在我的.NET缓存中保留一个内存中的条目列表,表示我的应用程序的最后N个HTTP请求。什么是最好的.NET序列用于此目的?
List<T>
,而非Dictionary<TKey,TValue>
)。我可能会点击网址/foo
10倍,这不是唯一的,但都需要添加到序列中。在我的脑海中,我想我可以使用Queue<T>
,并且在排队时只检查长度,如果它达到容量,则将旧的队列出列。但是关注线程安全(也许是ConcurrentQueue<T>
?)和最好的方法,因为这是一个“热门”。我的应用程序需要最佳的区域。
谢谢!
答案 0 :(得分:4)
这实际上取决于“最老的条目”的具体含义。
如果您正在寻找FIFO结构,则可以扩展ConcurrentQueue<T>
以弹出最旧的项目(第一项输入)。 (从this answer复制。)
public class FixedSizedQueue<T> : ConcurrentQueue<T>
{
private readonly object syncObject = new object();
public int Size { get; private set; }
public FixedSizedQueue(int size)
{
Size = size;
}
public new void Enqueue(T obj)
{
base.Enqueue(obj);
lock (syncObject)
{
while (base.Count > Size)
{
T outObj;
base.TryDequeue(out outObj);
}
}
}
}
如果您正在寻找能够在最后一个项目被访问时跟踪的缓存,并弹出最近访问过的 (有点像滑动) System.Runtime.Caching中的过期功能),您可以使用Least Recently Used (LRU) cache。
LurchTable项目中有一个名为CSharpTest.Net.Collections的高性能线程安全.NET实现,available on NuGet。
Introducing the LurchTable as a C# version of LinkedHashMap
有关其他选项,请参阅