Spring Data Redis, Cache und schnelle Zustände
Spring Data Redis bietet Zugriff auf Redis für Cache, Session, Rate Limits, Locks, Pub/Sub und kurzlebige Zustände.
Fachliche Einordnung
Redis ist im Enterprise-Kontext oft kritisch für Performance und Skalierung. Die Gefahr liegt in falscher Persistenz-Erwartung und unklarer TTL-Strategie.
Enterprise-Merksatz: Spring Data Redis bietet Zugriff auf Redis für Cache, Session, Rate Limits, Locks, Pub/Sub und kurzlebige Zustände.
Technische Darstellung
Kernkonzepte
- RedisTemplate und StringRedisTemplate.
- CacheManager mit TTL pro Cache.
- Atomic counters für Rate Limiting.
- Pub/Sub und Streams für einfache Eventfälle.
- Serialisierung bewusst wählen.
Wann einsetzen?
- Du brauchst schnellen Cache vor teuren Reads.
- Du willst sessionnahe Zustände clusterfähig halten.
- Du brauchst temporäre Token, Locks oder Zähler.
Typische Fehler und Risiken
- Cache ohne Invalidierungsstrategie.
- Redis als primäre Datenbank verwenden, obwohl Transaktions- und Auditpflichten relational bleiben.
- Java-Serialization im Cache über Jahre mitschleppen.
Legacy- und Modernisierungssicht
HTTP Session Replication aus klassischen Application Servern wird häufig durch Redis-gestützte Spring Session ersetzt.
Ausführliches Beispiel
Das Beispiel zeigt bewusst nicht nur Annotationen, sondern auch die Verantwortung der Schicht. In echten Projekten sollte der technische Spring-Code an Adapter- oder Konfigurationsrändern bleiben, während die Fachlogik testbar und möglichst frameworkarm bleibt.
@Service
class ProductCatalogService {
@Cacheable(cacheNames = "product-catalog", key = "#sku")
public ProductView findProduct(String sku) {
return productRepository.findViewBySku(sku).orElseThrow();
}
@CacheEvict(cacheNames = "product-catalog", key = "#event.sku")
@EventListener
public void invalidate(ProductChanged event) {
// Cache Invalidation bewusst an Domain Event koppeln.
}
}
@Configuration
class RedisCacheConfigurationFactory {
@Bean
RedisCacheManagerBuilderCustomizer cacheTtl() {
return builder -> builder.withCacheConfiguration("product-catalog",
RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(15)));
}
}
Checkliste für Reviews
- Ist die Verantwortung des Bausteins klar: Framework steuert Lebenszyklus, Library wird gezielt benutzt?
- Ist die Fachlogik außerhalb von Controller, Listener, Repository-Implementierung oder Konfiguration?
- Sind Fehlerfälle, Timeouts, Security, Monitoring und Tests sichtbar modelliert?
- Gibt es klare Grenzen zwischen DTO, Domäne, Persistence und Infrastruktur?