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

要求

  • 固定项目数(例如 50)
  • 可序列化(需要将序列添加到 .NET 缓存中)
  • 当我尝试添加 max+1 条目时,它会自动删除最旧的项目以腾出空间
  • 不太关心物品的顺序
  • 需要能够在单个操作中获取所有项目,以便执行聚合计算。
  • 线程安全的
  • 非唯一(例如 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

    有关其他选项,请参阅
  • Is it there any LRU implementation of IDictionary?
  • LRUCache.NET
  • A High Performance Multi-Threaded LRU Cache
  • LRU Cache with C#
  • LRUPractice.cs
  • 关于c# - 增长、固定容量通用序列的最佳选择,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46680342/

    10-13 05:55