我知道这很容易实现,但我想重用一些已经存在的东西。简单易用的java中的LRU缓存
问题我想解决的是,我为不同的页面,角色加载配置(从XML所以我想缓存它们)...所以输入组合可以增长很多(但在99%不会) 。要处理这1%,我想有一些最大数量的项目在缓存中...
直到知道我已经找到了org.apache.commons.collections.map.LRUMap在Apache公用程序,它看起来不错,但想要也检查别的东西。任何建议?
我知道这很容易实现,但我想重用一些已经存在的东西。简单易用的java中的LRU缓存
问题我想解决的是,我为不同的页面,角色加载配置(从XML所以我想缓存它们)...所以输入组合可以增长很多(但在99%不会) 。要处理这1%,我想有一些最大数量的项目在缓存中...
直到知道我已经找到了org.apache.commons.collections.map.LRUMap在Apache公用程序,它看起来不错,但想要也检查别的东西。任何建议?
您可以使用LinkedHashMap(Java 1.4+):
// Create cache
final int MAX_ENTRIES = 100;
Map cache = new LinkedHashMap(MAX_ENTRIES+1, .75F, true) {
// This method is called just after a new entry has been added
public boolean removeEldestEntry(Map.Entry eldest) {
return size() > MAX_ENTRIES;
}
};
// Add to cache
Object key = "key";
cache.put(key, object);
// Get object
Object o = cache.get(key);
if (o == null && !cache.containsKey(key)) {
// Object not in cache. If null is not a possible value in the cache,
// the call to cache.contains(key) is not needed
}
// If the cache is to be used by multiple threads,
// the cache must be wrapped with code to synchronize the methods
cache = (Map)Collections.synchronizedMap(cache);
来自公共收藏的LRUMap也是一个不错的选择。 – 2008-10-22 08:35:10
好吧,所以我决定使用LRUMap。 – Juraj 2008-10-22 09:22:04
这是一个老问题,但为后人我想列出ConcurrentLinkedHashMap,这是线程安全的,不像LRUMap。用法很简单:
ConcurrentMap<K, V> cache = new ConcurrentLinkedHashMap.Builder<K, V>()
.maximumWeightedCapacity(1000)
.build();
和文档有一些很好的examples,怎么样使LRU高速缓存大小为基础的,而不是数量-的项为主。
我也有同样的问题,我还没有找到任何好的库...所以我创建了我自己的。
simplelrucache提供线程安全,非常简单的非分布式LRU缓存,支持TTL。它提供了两种实现
你可以找到它here。
Here是一个非常简单易用的Java LRU缓存。 虽然它简短和简单,它是生产质量。 解释代码(查看README.md)并进行一些单元测试。
这是我的实现,它可以让我在内存中保留最佳数量的元素。
问题是,我不需要跟踪哪些对象当前正在使用,因为我正在使用MRU对象的LinkedHashMap和LRU对象的WeakHashMap的组合。 因此,缓存容量不能小于MRU大小加上GC让我保留的大小。每当物体从MRU上脱落时,只要GC有它们,它们就会进入LRU。
public class Cache<K,V> {
final Map<K,V> MRUdata;
final Map<K,V> LRUdata;
public Cache(final int capacity)
{
LRUdata = new WeakHashMap<K, V>();
MRUdata = new LinkedHashMap<K, V>(capacity+1, 1.0f, true) {
protected boolean removeEldestEntry(Map.Entry<K,V> entry)
{
if (this.size() > capacity) {
LRUdata.put(entry.getKey(), entry.getValue());
return true;
}
return false;
};
};
}
public synchronized V tryGet(K key)
{
V value = MRUdata.get(key);
if (value!=null)
return value;
value = LRUdata.get(key);
if (value!=null) {
LRUdata.remove(key);
MRUdata.put(key, value);
}
return value;
}
public synchronized void set(K key, V value)
{
LRUdata.remove(key);
MRUdata.put(key, value);
}
}
@Suporwski你是怎么解决这个问题的? – Hunt 2012-08-22 10:37:47
@Hunt我有来自公共的LRUMap – Juraj 2012-11-26 09:36:07
非常类似的问题[这里](http://stackoverflow.com/q/221525/2032064) – Mifeet 2016-05-15 07:49:19