“Coffee is a way of stealing time that should by rights belong to your older self.”
Terry Pratchett, Thud!
Obwohl die Grundregel der Optimierung lautet “Später!”, kann es immer wieder hilfreich sein, einen Cache in die eigene Software einzubauen.
Ein Cache speichert Objekte, deren Erstellung teuer ist, weil sie vielleicht von der Festplatte oder aus der Datenbank nachgeladen werden müssen, oder zuvor aufwendige Berechnungen angestellt werden müssen. Mit dem Speichern ist es aber nicht getan, denn irgendwann wird der wertvolle Arbeitsspeicher rar und es wäre ratsam, nicht verwendete Objekte aus dem Speicher zu löschen.
Wer seine Daten nicht mehr in einer HashMap vorhalten möchte, eine schnelle und einfach zu konfigurierende Lösung sucht, ist mit Caffeine bestens versorgt.
LoadingCache<String, Person> persons = Caffeine.newBuilder().maximumSize(1000)
.expireAfterAccess(5, TimeUnit.HOURS)
.build(key -> loadFromGenealogy(key));
Der obige Dreizeiler erzeugt einen Cache für Person Instanzen, der maximal 1000 Objekte speichern und diese Objekte nach 5 Stunden ohne Verwendung wieder aus dem Speicher entfernen soll. Zusätzlich ist in der letzten Zeile definiert, woher unser Cache unbekannte Werte bezieht. Die Methode loadFromGenealogy() lädt je nach Schlüssel die Informationen von einem externen Ahnenforschungsdatenbank. Der Schlüssel ist in unserem Beispiel eine GINA URN aus dem Beitrag Stammbäume ins Netz mit GINA.
Möchte man einen Eintrag explizit aus dem Cache löschen, weil es doch kein Verwandter ist oder eines der schwarzen Schafe der Familie, dann kann man solche Einträge auch direkt löschen.
persons.invalidate(key)
Dabei ist der Schlüssel key in unseren Beispiel die URN der entsprechenden Persona non grata.
Damit ist dieser Beitrag auch schon am Ende, aber wer neugierig darauf ist, wie man in Spring Boot mit Caffeine arbeiten kann, der sollte demnächst mal wieder vorbeischauen.