⌂ Index
Kapitel 09 · Data

Spring Data Redis, Cache und schnelle Zustände

Typ: LibraryVersion 2 ausführlich

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

Service Cache Abstraction RedisTemplate TTL Redis Cluster Database Fallback
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?