[Java] LRU Cache mit Hilfe einer LinkedHashMap

Oftmals benötigt man als Java-Entwickler eine kleine, feine Cache-Klasse, um verschiedene Objekte zwischenzuspeichern und die Datenbank zu schonen. Oftmals wird dann selber mit Arrays, Maps und Listen rumgefuchtelt. Viele kennen nämlich gar nicht die praktische Klasse java.util.LinkedHashMap.

Dabei ist es mit Hilfe dieser Klasse extrem einfach, einen sogenannten LRU-Cache aufzubauen, also einen Least-Recently-Used-Cache. Sprich einen Cache, der die n letzten Objekte speichert. Man gibt also eine feste Cachegröße vor, zum Beispiel 100 und der Cache sorgt dann selber dafür, das Objekte mit einer hohen Zugriffsanzahl weiterhin gecached bleiben und Objekte mit wenigen Zugriffen aus dem Cache entfernt werden. Altes fliegt also nach hinten raus, in dem Fall wenn es mehr als 100 Elemente sind.

Christian d’Heureuse hat dazu jetzt auf Basis der genannten Klasse einen Cache geschrieben, den ich selber leicht abgewandelt so schon benutzt habe. Auf seiner Seite source-code.biz findet sich der entsprechende Source-Code (als ZIP herunterladen) dazu. BTW: Der Trick daraus einen LRU Cache zu machen, ist das Überschreiben der Methode removeEldestEntry der Klasse LinkedHashMap. Damit hat man einen relativ performanten Cache, ohne selber Iterationen einbauen zu müssen, um ggf. veraltete Elemente zu erkennen.

Eine echt praktische Klasse die einem mit Java-Standard-Mitteln eine nette kleine Caching-Funktion bietet.

2 Kommentare zu „[Java] LRU Cache mit Hilfe einer LinkedHashMap

  1. Das ist doch kein wirklicher LRU! Das ist bestenfalls ein Least recently added. Der User-Zugriff hat doch keine Auswirkung auf das Element.

  2. Doch, es ist ein LRU Cache, aus folgendem Grund:

    – Der Konstruktor der Map wird mit drei Parametern aufgerufen, der dritte lautet „true“, laut Spec. unter z.B. https://docs.oracle.com/javase/1.5.0/docs/api/java/util/LinkedHashMap.html#LinkedHashMap%28int,%20float,%20boolean%29 erzeugt dies eine Map mit access-order, die Reihenfolge wird also durch den Zugriff bestimmt, nicht durch das Hinzufügen zur Map.
    – Zweitens wird die removeEldestEntry Methode überschrieben, diese sorgt bei einer access.ordered Map für die Entfernung des Eintrags mit dem am längsten zurückliegenden Zugriff, siehe auch https://docs.oracle.com/javase/1.5.0/docs/api/java/util/LinkedHashMap.html#removeEldestEntry%28java.util.Map.Entry%29

    Demnach ist es also ein LRU Cache und es hat nichts mit dem Zeitpunkt des Hinzufügens zur Map zutun.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.