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

时间:2017-10-11 05:16:16

标签: c# .net sequences

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

要求

  • 固定数量的项目(例如50)
  • Serializable(需要将序列添加到.NET缓存中)
  • 当我尝试添加max + 1条目时,它会自动删除最旧的项目以腾出空间
  • 并非真正关心物品的顺序
  • 需要能够在一次操作中获取所有项目,以便执行汇总计算。
  • 线程安全
  • 非唯一(例如List<T>,而非Dictionary<TKey,TValue>)。我可能会点击网址/foo 10倍,这不是唯一的,但都需要添加到序列中。

在我的脑海中,我想我可以使用Queue<T>,并且在排队时只检查长度,如果它达到容量,则将旧的队列出列。但是关注线程安全(也许是ConcurrentQueue<T>?)和最好的方法,因为这是一个“热门”。我的应用程序需要最佳的区域。

谢谢!

1 个答案:

答案 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

有关其他选项,请参阅