简单易用的Java语言LRU缓存
我知道它很容易实现,但我想重用已经存在的东西。
我想解决的问题是,我加载了配置(从XML,所以我想缓存它们)不同的页面,角色,...因此,输入的组合可以增长很多(但在99%中不会)。为了处理这1%,我想在缓存中有一些最大数量的项目...
直到知道我已经在apache commons中找到了org.apache.commons.collections.map.LRUMap,它看起来很好,但想检查其他东西。有什么建议吗?
我知道它很容易实现,但我想重用已经存在的东西。
我想解决的问题是,我加载了配置(从XML,所以我想缓存它们)不同的页面,角色,...因此,输入的组合可以增长很多(但在99%中不会)。为了处理这1%,我想在缓存中有一些最大数量的项目...
直到知道我已经在apache commons中找到了org.apache.commons.collections.map.LRUMap,它看起来很好,但想检查其他东西。有什么建议吗?
您可以使用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);
这是一个古老的问题,但对于后代,我想列出ConcurrentLinkedHashMap,它是线程安全的,与LRUMap不同。使用起来非常简单:
ConcurrentMap<K, V> cache = new ConcurrentLinkedHashMap.Builder<K, V>()
.maximumWeightedCapacity(1000)
.build();
文档提供了一些很好的例子,例如如何使 LRU 缓存基于大小而不是基于项目数。