Mittwoch, 13. Juli 2011

Einfacher LRU-Cache in Java

Manchmal geht es erstaunlich einfach und man muss nur wissen, wie. Jedenfalls freue ich mich über alles, was einfach und ohne Zusatzbibliothek einsatzfähig gemacht werden kann. So zum Beispiel einen LRU-Cache (least recently used). Den kann man gut benutzen, wenn man einen Cache braucht, der jedoch nicht uneingeschränkt wachsen darf. Dafür lässt sich eine LinkedHashMap verwenden, der eine Maximalgröße verpasst wird. Die Objekt-Instanzen in der LinkedHashMap rutschen mit jedem weiteren, hinzugefügten Eintrag weiter nach Hinten. Die im Beispiel implementierte Methode removeEldestEntry sorgt dann dafür, dass die letzten, und somit auch die ältesten Einträge, die über die Maximalgröße hinausreichen, weggeworfen werden. Einträge wiederum die via get angefordert wurden, wandern praktischer Weise auch gleich wieder nach vorne, was dazu führt, dass sie länger im Cache verbleiben.

Hier also die versprochene Klasse. An Einfachheit wirklich kaum zu übertreffen:

/**
 * Provides support for a LRU (least recently used) cache.
 * This cache is not thread safe and would need to wrap with Collections.synchronizedMap() if thread safety is needed.
 */
public class LRUCacheMap<K, V> extends LinkedHashMap<K, V>{
    
    private final int maxSize;
    
    /**
     * @param maxSize maximum number of entries.
     */
    public LRUCacheMap(final int maxSize) {
        super(maxSize * 4 / 3, 0.75f, true);
        this.maxSize = maxSize;
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
        return size() > maxSize;
    }
}

via Vanilla Java

Keine Kommentare:

Kommentar veröffentlichen