java中简单易用的LRUcaching

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

问题我想解决的是,我加载configuration(从XML,所以我想caching他们)不同的页面,angular色,…所以input的组合可以增长很多(但在99%不会)。 为了处理这个1%,我想在caching中有一些最大数量的项目…

直到知道我已经在apache的commons中find了org.apache.commons.collections.map.LRUMap,它看起来很好,但还想检查其他东西。 任何build议?

你可以使用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(); 

而且文档中有一些很好的例子 ,比如如何使LRUcaching基于大小而不是基于数量。

这里是我的实现,让我保持在内存中的最佳数量的元素。

关键是我不需要跟踪哪些对象当前正在使用,因为我使用的MRU对象的LinkedHashMap和LRU对象的WeakHashMap的组合。 所以caching容量不能小于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); } } 

我也有同样的问题,我还没有find任何好的图书馆…所以我创造了我自己的。

simplelrucache提供线程安全,非常简单,非分布式的LRUcaching和TTL支持。 它提供了两个实现

  • 基于ConcurrentLinkedHashMap的并发
  • 基于LinkedHashMap进行同步

你可以在这里find它。

在Java中, 这是一个非常简单易用的LRUcaching。 虽然简单,但却是生产质量。 代码解释(看看README.md),并有一些unit testing。