java中简单易用的LRU缓存

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (24)

我知道这很容易实现,但我想重用已经存在的东西。

我想要解决的问题是,我为不同的页面,角色加载了配置(来自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缓存大小而不是基于数量的项目。

扫码关注云+社区