View Javadoc

1   package org.varienaja.util;
2   
3   import java.util.LinkedHashMap;
4   import java.util.Map;
5   
6   import org.apache.log4j.Logger;
7   
8   /**
9    * LRU-cache. When elements are added, the LRU-elements will be deleted
10   * when the cache is full.
11   * @author Varienaja
12   */
13  public class LRUMap<K,V> extends LinkedHashMap<K,V> {
14  	private static final Logger log = Logger.getLogger(LRUMap.class);
15  	
16  	private static final long serialVersionUID = 200808182210L;
17  	private int _max_entries;
18  	private int _hits;
19  	private int _misses;
20  	private String _name;
21  
22  	/**
23  	 * Creates an instance of a LRU-cache.
24  	 * @param name The name of this LRU-cache (for logging purposes)
25  	 * @param max_entries The maximum size of this cache.
26  	 */
27  	public LRUMap(String name, int max_entries) {
28  		super(max_entries, 0.75f, true);
29  		_name = name;
30  		_hits = 0;
31  		_misses = 0;
32  		_max_entries = max_entries;
33  	}
34  	
35  	/*
36  	 * Adds hitrate measurement.
37  	 * (non-Javadoc)
38  	 * @see java.util.LinkedHashMap#get(java.lang.Object)
39  	 */
40  	@Override
41  	public V get(Object key) {
42  		V v = super.get(key);
43  		
44  		if (v==null) {
45  			_misses++;
46  		} else {
47  			_hits++;
48  		}
49  		
50  		if ((_hits+_misses) % 100 ==0) {
51  			log.debug("LRUMap ("+_name+") size: "+size()+" Hits: " +_hits+ " Misses: "+ _misses + " hitrate: " + getHitrate());
52  		}
53  		
54  		return v;
55  	}
56  	
57  	/*
58  	 * (non-Javadoc)
59  	 * @see java.util.LinkedHashMap#removeEldestEntry(java.util.Map.Entry)
60  	 */
61      protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
62          return size() > _max_entries;
63      }
64      
65      private String getHitrate() {
66      	return 100*_hits / (_hits + _misses) + "%";
67      }
68  }