我需要提供对跨会话的所有用户持久存储的键/值对存储的访问.
我可以轻松地为此创建一个单例,但出于性能原因,我想将字典的大小限制为10000个项目(或任何高性能数字,因为该对象将无限期地持续存在)
是否有一种字典形式,我可以指定存储对象数量的限制,当超过该限制时,删除最旧的条目?
Ser*_*kiy 14
没有这样的内置字典,但您可以构建自己的字典.您将需要一个密钥队列 - 这将允许您快速查找最旧的条目并将其删除.此外,您还需要一个简单的字典来保存您的值 - 这样您就可以快速搜索它们:
public class SuperDictionary<TKey, TValue>
{
private Dictionary<TKey, TValue> dictionary;
private Queue<TKey> keys;
private int capacity;
public SuperDictionary(int capacity)
{
this.keys = new Queue<TKey>(capacity);
this.capacity = capacity;
this.dictionary = new Dictionary<TKey, TValue>(capacity);
}
public void Add(TKey key, TValue value)
{
if (dictionary.Count == capacity)
{
var oldestKey = keys.Dequeue();
dictionary.Remove(oldestKey);
}
dictionary.Add(key, value);
keys.Enqueue(key);
}
public TValue this[TKey key]
{
get { return dictionary[key]; }
}
}
Run Code Online (Sandbox Code Playgroud)
注意:您可以实现IDictionary<TKey,TValue>接口,使此类成为"真正的"字典.
使用Cache,而不是Session.它不是特定于用户的,您可以设置缓存的最大大小.添加新项目并且缓存已满时,它将删除项目以腾出空间.它允许复杂的老化机制,例如在固定的时间段之后移除的项目,在其最后使用之后的固定时间段,优先级(在决定移除什么时要考虑)等.