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