我想实现一个简单的内存中LRU缓存系统,我正在考虑一种基于IDictionary实现的解决方案,它可以处理哈希LRU机制。我来自java,我有过使用LinkedHashMap
的经验,它可以很好地满足我的需求:我在任何地方都找不到针对.NET的类似解决方案。
有没有人开发过它,或者有人有过这样的经历?
发布于 2009-04-15 16:07:36
发布于 2010-09-15 15:44:44
这是我们为我们自己的网站开发的一个非常简单快速的实现。
我们试图尽可能地改进代码,同时保持它的线程安全。我认为代码非常简单明了,但是如果你需要一些解释或者关于如何使用它的指南,请不要犹豫。
namespace LRUCache
{
public class LRUCache<K,V>
{
private int capacity;
private Dictionary<K, LinkedListNode<LRUCacheItem<K, V>>> cacheMap = new Dictionary<K, LinkedListNode<LRUCacheItem<K, V>>>();
private LinkedList<LRUCacheItem<K, V>> lruList = new LinkedList<LRUCacheItem<K, V>>();
public LRUCache(int capacity)
{
this.capacity = capacity;
}
[MethodImpl(MethodImplOptions.Synchronized)]
public V get(K key)
{
LinkedListNode<LRUCacheItem<K, V>> node;
if (cacheMap.TryGetValue(key, out node))
{
V value = node.Value.value;
lruList.Remove(node);
lruList.AddLast(node);
return value;
}
return default(V);
}
[MethodImpl(MethodImplOptions.Synchronized)]
public void add(K key, V val)
{
if (cacheMap.TryGetValue(key, out var existingNode))
{
lruList.Remove(existingNode);
}
else if (cacheMap.Count >= capacity)
{
RemoveFirst();
}
LRUCacheItem<K, V> cacheItem = new LRUCacheItem<K, V>(key, val);
LinkedListNode<LRUCacheItem<K, V>> node = new LinkedListNode<LRUCacheItem<K, V>>(cacheItem);
lruList.AddLast(node);
// cacheMap.Add(key, node); - here's bug if try to add already existing value
cacheMap[key] = node;
}
private void RemoveFirst()
{
// Remove from LRUPriority
LinkedListNode<LRUCacheItem<K,V>> node = lruList.First;
lruList.RemoveFirst();
// Remove from cache
cacheMap.Remove(node.Value.key);
}
}
class LRUCacheItem<K,V>
{
public LRUCacheItem(K k, V v)
{
key = k;
value = v;
}
public K key;
public V value;
}
}
发布于 2011-06-03 16:01:23
在谷歌搜索的时候找到了你的答案,还发现了这个:
http://code.google.com/p/csharp-lru-cache/
csharp-lru-cache:LRU缓存集合类库
这是一个集合类,用作最近最少使用的缓存。它实现了ICollection<T>
,但也公开了其他三个成员:
Capacity
,缓存可以包含的最大项数。一旦集合达到容量,向缓存添加新项将导致最近最少使用的项被丢弃。如果在构造时将容量设置为0,则缓存不会自动丢弃collection.DiscardingOldestItem
,中最旧的(即最近最少使用的)项,这是当缓存将要丢弃其最旧的项时引发的事件。这是一个非常简单的实现。虽然它的Add和Remove方法是线程安全的,但它不应该在繁重的多线程环境中使用,因为在这些方法期间整个集合都会被锁定。https://stackoverflow.com/questions/754233
复制相似问题