我试图在我的 .NET 缓存中保留一个内存中的条目列表,代表对我的应用程序的最后 N 个 HTTP 请求。用于此目的的最佳 .NET 序列是什么?
要求
List<T>
,而不是 Dictionary<TKey,TValue>
)。我可能会访问 URL /foo
10 次,这不是唯一的,但都需要添加到序列中。 在我的头顶上,我想我可以使用
Queue<T>
,在排队时只需检查长度,如果达到容量,则将旧的出列。但关注线程安全(可能是 ConcurrentQueue<T>
?)和最佳方法,因为这是我的应用程序的“热门”领域,需要优化。谢谢!
最佳答案
这实际上取决于您对“最旧条目”的具体含义。
如果您正在寻找 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
有关其他选项,请参阅
关于c# - 增长、固定容量通用序列的最佳选择,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46680342/