Caching in Java: Redis, Caffeine und andere Tools

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Caching in Java: Redis und andere Lösungen

Caching ist eine der wichtigsten Techniken zur Leistungsoptimierung in Java-Anwendungen. Es ermöglicht, die Antwortzeit zu verkürzen und die Last auf Datenbanken und externe APIs zu reduzieren. In diesem Artikel besprechen wir beliebte Caching-Tools: Redis, Caffeine, Ehcache und die integrierten Mittel von Spring Cache.



Warum ist Caching in Java notwendig?

Ohne Cache kann jeder Datenzugriff teure Operationen verursachen: SQL-Abfragen, REST-API-Aufrufe oder komplexe Berechnungen. Der Cache speichert die Ergebnisse dieser Operationen in einem schnellen Zugriff (Arbeitsspeicher oder verteilter Speicher), was Folgendes bietet:

  • Reduzierung der Antwortzeit (Latenz)
  • Verringerung der Backend-Last
  • Einsparung von Serverressourcen
  • Skalierbarkeit bei hoher Last


1. Redis — verteiltes Caching

Redis ist ein In-Memory-Datenspeicher, der häufig als verteilter Cache verwendet wird. Es unterstützt komplexe Datenstrukturen: Strings, Listen, Mengen, Hashes und sortierte Mengen. Für Java gibt es den beliebten Client Jedis und den moderneren Lettuce.



Redis-Verbindung über Jedis

Fügen Sie die Abhängigkeit in pom.xml hinzu:

<dependency>    <groupId>redis.clients</groupId>    <artifactId>jedis</artifactId>    <version>5.0.2</version></dependency>


Beispiel für die Arbeit mit dem Redis-Cache:

import redis.clients.jedis.Jedis;

public class RedisCacheExample { public static void main(String[] args) { try (Jedis jedis = new Jedis("localhost", 6379)) { // Daten mit TTL (Lebensdauer) speichern jedis.setex("user:123", 3600, "{\\"name\\":\\"Ivan\\",\\"age\\":30}");

// Aus dem Cache lesen String cachedUser = jedis.get("user:123"); System.out.println("Aus dem Cache: " + cachedUser);

// Existenz des Schlüssels prüfen if (jedis.exists("user:123")) { System.out.println("Schlüssel existiert"); } } }}


Vorteile von Redis: Verteiltheit, Persistenz, TTL-Unterstützung, Pub/Sub, Clustering. Nachteile: erfordert einen separaten Server, Objektserialisierung.



2. Caffeine — leistungsstarker lokaler Cache

Caffeine ist eine moderne Bibliothek für In-Memory-Caching in Java. Sie basiert auf dem W-TinyLFU-Algorithmus, der eine hohe Effizienz bei geringem Speicherverbrauch gewährleistet. Caffeine wird häufig in Spring Boot 2.x und 3.x als Standard-Cache verwendet.



Beispiel mit Caffeine

import com.github.benmanes.caffeine.cache.Cache;import com.github.benmanes.caffeine.cache.Caffeine;import java.util.concurrent.TimeUnit;

public class CaffeineCacheExample { public static void main(String[] args) { Cache<String, String> cache = Caffeine.newBuilder() .expireAfterWrite(10, TimeUnit.MINUTES) .maximumSize(10_000) .recordStats() .build();

// Schreiben cache.put("product:42", "Notebook Dell XPS 15");

// Lesen mit Fallback String product = cache.get("product:42", key -> loadFromDB(key)); System.out.println("Produkt: " + product);

// Statistik System.out.println("Treffer: " + cache.stats().hitCount()); }

private static String loadFromDB(String key) { // Simulation des Ladens aus der DB return "Produkt mit Schlüssel " + key; }}


Vorteile von Caffeine: hohe Geschwindigkeit, automatische Räumung, Statistik, Integration mit Spring. Nachteile: nur lokal (nicht verteilt).



3. Ehcache — ausgereifter lokaler Cache

Ehcache

Empfehlungen