增长的、固定容量的通用序列的最佳选择
Best choice for growing, fixed capacity generic sequence
我试图在我的 .NET 缓存中保留一个条目的内存列表,代表对我的应用程序的最后 N 个 HTTP 请求。为此使用的最佳 .NET 序列是什么?
要求
- 固定数量的项目(例如 50)
- 可序列化(需要将序列添加到 .NET 缓存)
- 当我尝试添加 max+1 个条目时,它会自动删除 最旧的 条目以腾出空间
- 不太关心项目的顺序
- 需要能够在一次操作中得到所有项,以便执行聚合计算。
- 线程安全
- 非唯一(例如
List<T>
,而不是 Dictionary<TKey,TValue>
)。我可能会点击 URL /foo
10 次,这不是唯一的,但都需要添加到序列中。
在我的脑海中,我在想我可以使用 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
有关其他选项,请参阅
- Is it there any LRU implementation of IDictionary?
- LRUCache.NET
- A High Performance Multi-Threaded LRU Cache
- LRU Cache with C#
- LRUPractice.cs
我试图在我的 .NET 缓存中保留一个条目的内存列表,代表对我的应用程序的最后 N 个 HTTP 请求。为此使用的最佳 .NET 序列是什么?
要求
- 固定数量的项目(例如 50)
- 可序列化(需要将序列添加到 .NET 缓存)
- 当我尝试添加 max+1 个条目时,它会自动删除 最旧的 条目以腾出空间
- 不太关心项目的顺序
- 需要能够在一次操作中得到所有项,以便执行聚合计算。
- 线程安全
- 非唯一(例如
List<T>
,而不是Dictionary<TKey,TValue>
)。我可能会点击 URL/foo
10 次,这不是唯一的,但都需要添加到序列中。
在我的脑海中,我在想我可以使用 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
有关其他选项,请参阅
- Is it there any LRU implementation of IDictionary?
- LRUCache.NET
- A High Performance Multi-Threaded LRU Cache
- LRU Cache with C#
- LRUPractice.cs