增长的、固定容量的通用序列的最佳选择

Best choice for growing, fixed capacity generic sequence

我试图在我的 .NET 缓存中保留一个条目的内存列表,代表对我的应用程序的最后 N 个 HTTP 请求。为此使用的最佳 .NET 序列是什么?

要求

在我的脑海中,我在想我可以使用 Queue<T>,并且在入队时只需检查长度,如果它达到容量,则将旧的出队。但担心线程安全(ConcurrentQueue<T> 可能?)和最佳方法,因为这是我的应用程序中需要优化的 'hot' 区域。

谢谢!

这实际上取决于您 "oldest entry" 的具体含义。

如果您正在寻找 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);
            }
        }
    }
}

如果您正在寻找一个缓存来跟踪最后一个项目被访问的时间,并弹出最近访问的那个[=42] =](有点像 System.Runtime.Caching 中的滑动过期功能),您可以使用 Least Recently Used (LRU) cache.

有一个名为 LurchTable in the CSharpTest.Net.Collections project, which is available on NuGet 的高性能线程安全 .NET 实现。

Introducing the LurchTable as a C# version of LinkedHashMap

有关其他选项,请参阅