首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在java中简单易用的LRU缓存

在java中简单易用的LRU缓存
EN

Stack Overflow用户
提问于 2008-10-22 08:27:04
回答 4查看 65.1K关注 0票数 74

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

我想解决的问题是,我加载配置(从XML,所以我想缓存它们),为不同的页面,角色,...因此,输入的组合可以增长很多(但99%不会)。为了处理这1%,我希望在缓存中有一些最大数量的项目...

直到我知道我已经在apache commons中发现了org.apache.commons.collections.map.LRUMap,它看起来很好,但也想检查一下其他东西。有什么建议吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-10-22 08:33:09

您可以使用LinkedHashMap (Java 1.4+):

代码语言:javascript
复制
// 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);
票数 119
EN

Stack Overflow用户

发布于 2011-09-28 21:41:05

这是一个古老的问题,但我想为后人列出ConcurrentLinkedHashMap,它与LRUMap不同,它是线程安全的。使用起来非常简单:

代码语言:javascript
复制
ConcurrentMap<K, V> cache = new ConcurrentLinkedHashMap.Builder<K, V>()
    .maximumWeightedCapacity(1000)
    .build();

并且文档中有一些很好的examples,比如如何使LRU缓存基于大小而不是基于项数。

票数 33
EN

Stack Overflow用户

发布于 2012-07-31 08:21:01

这是我的实现,它让我在内存中保留了最优数量的元素。

重点是,我不需要跟踪当前正在使用的对象,因为我使用了MRU对象的LinkedHashMap和LRU对象的WeakHashMap的组合。所以缓存容量不小于MRU大小加上GC允许的值。当对象从MRU上掉下来时,只要GC拥有它们,它们就会一直保存在LRU中。

代码语言:javascript
复制
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);
}
}
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/224868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档