...

Redis LFU vs LRU: Welche Eviction-Policy ist die richtige?

Redis LFU und LRU entscheiden, welche Schlüssel bei knappen Ressourcen aus dem Cache fallen – und damit über Trefferquote, Antwortzeit und Speicherverbrauch. Ich zeige dir, wann die Frequenz-orientierte Policy LFU oder die Aktualitäts-orientierte Policy LRU besser passt, wie du sie konfigurierst und welche Effekte allkeys-lfu vs. allkeys-lru im Alltag bringen; das Fokus-Keyword Redis LFU liegt dabei im Zentrum.

Zentrale Punkte

  • Recency vs. Frequency: LRU bevorzugt jüngste Zugriffe, LFU bevorzugt häufige Zugriffe.
  • Approximation in Redis: Beide Policies arbeiten mit Stichproben über maxmemory-samples.
  • Workloads entscheiden: Sessions/Dashboards → LRU, Bestseller/Rankings → LFU.
  • Tuning zählt: lfu-decay-time, maxmemory, maxmemory-samples sauber einstellen.
  • Monitoring nötig: Hit-Rate, Evictions/s und Latenz kontinuierlich prüfen.

Wie Eviction in Redis abläuft

Redis hält Daten im RAM, erreicht der Prozess maxmemory, muss es Schlüssel verdrängen. Genau hier greifen Policies wie allkeys-lru und allkeys-lfu, die bestimmen, welche Einträge Platz machen. Ich fokussiere mich auf diese beiden Varianten, weil sie das gesamte Dataset berücksichtigen, nicht nur Keys mit TTL. Redis wählt den zu löschenden Schlüssel über eine Stichprobe, die du mit maxmemory-samples steuerst; mehr Samples erhöhen die Genauigkeit, kosten aber CPU. Dieser Ansatz liefert in großen Keyspaces gute Ergebnisse, ohne die Verwaltung zu teuer zu machen.

Interna: wie Redis LRU und Redis LFU umsetzt

Beide Policies arbeiten in Redis approximativ, um konstant schnell zu bleiben. LRU speichert pro Objekt eine Zeitmarke für den letzten Zugriff. Bei Eviction zieht Redis eine Stichprobe und verwirft den „ältesten“ Kandidaten der Auswahl. Das ist in der Praxis extrem effizient und hinreichend genau, wenn du die Stichprobengröße passend zum Keyspace wählst.

Redis LFU ergänzt diese Idee um eine kompakte Frequenzmetrik, die über die Zeit altert (Decay). Jeder Zugriff erhöht den Nutzungszähler nicht linear, sondern gedämpft, damit einzelne Burst-Phasen den Zähler nicht dauerhaft sättigen. Gleichzeitig sorgt ein Zeitverfall dafür, dass vergangene Popularität irgendwann an Gewicht verliert. Über Parameter wie lfu-decay-time (wie schnell altert die Historie) und einen internen Log-Faktor (wie stark wachsen die Zähler je Zugriff) balancierst du Reaktionsfreude gegen Stabilität der Priorisierung. Merkregel: Kleinere Decay-Werte → schnellere Anpassung, größere Werte → trägere, aber stabilere Prioritäten.

LRU in Redis: Prinzip, Stärken, Fallstricke

LRU entfernt den am längsten ungenutzten Schlüssel und priorisiert damit Aktualität. Diese Logik passt zu Mustern mit zeitlicher Lokalität wie Sessions, Live-Dashboards oder kurzfristigen API-Antworten. Redis nutzt ein approximiertes LRU: Einträge tragen eine Zeitmarke, Stichproben wählen den ältesten Kandidaten – schnell und nachvollziehbar. LRU reagiert rasch auf Änderungen, weil kürzlich genutzte Keys oben bleiben und ältere weichen. Problematisch können große einmalige Scans werden, die den Cache mit kurzlebigen Werten füllen und wichtige, kurzzeitig ruhende Schlüssel verdrängen.

Praktischer Tipp: Wenn du LRU einsetzt und regelmäßig „kalte“ Massenabfragen (z. B. Backoffice-Reports) fährst, kapsel diese Workloads in separate Caches oder plane großzügigere maxmemory-Reserven ein. So vermeidest du Cache-Pollution, bei der wertvolle, bald wieder benötigte Daten verdrängt werden.

LFU in Redis: Prinzip, Stärken, Fallstricke

LFU entfernt Schlüssel mit geringer Nutzungshäufigkeit und schützt damit langfristige „Hot Keys“. Der interne Zähler wächst logarithmisch und altert über die Zeit (Decay), damit alte Popularität nicht ewig zählt. Das führt zu einer ausgleichenden Gewichtung: Häufig genutzte Daten bleiben länger erhalten, einzelne Ausreißer verschieben die Priorität kaum. LFU liefert in Katalogen, Rankings oder Feature-Caches oft eine höhere Hit-Rate, weil es bewährte Schlüssel im Speicher hält. Es reagiert aber gemächlicher auf neue Trends, weshalb das Tuning von lfu-decay-time wichtig bleibt.

Für On/Off-Trends (z. B. Marketing-Kampagnen) gilt: Setze das Decay so, dass ein neuer Trend merkbar Einfluss hat, ohne dass kurzzeitiges Rauschen den Cache ständig umsortiert. In vielen Projekten bewährt sich: konservativer Start, dann schrittweise beschleunigen, bis die Hit-Rate unter Last stabil bleibt.

Gegenüberstellung: Recency vs. Frequency im Alltag

Am Kern trennt LRU „wann zuletzt verwendet“ und LFU „wie oft verwendet“ – ich wähle anhand des realen Workloads. Für volatile, nutzernahe Daten wirkt LRU meist natürlicher, da frische Zugriffe künftige Zugriffe häufig vorwegnehmen. Für populäre Produktdaten oder Konfigurationen fährt LFU besser, weil dauerhafte Beliebtheit zählt. In Mischszenarien trenne ich Caches nach Datentypen und setze unterschiedliche Policies ein. Die folgende Tabelle fasst die Unterschiede knapp zusammen und gibt dir eine schnelle Entscheidungshilfe.

Aspekt LRU (allkeys-lru) LFU (allkeys-lfu)
Priorität Aktualität der Zugriffe Häufigkeit der Zugriffe
Reaktion auf Musterwechsel Schnell, da letzte Nutzung zählt Gemäßigt, da Historie mitwirkt
Empfohlene Workloads Sessions, Dashboards, Live-APIs Bestseller, Rankings, Feature-Caches
Empfindlichkeit für „Pollution“ Eher hoch bei großen Scans Eher gering durch Frequenz-Zähler
Tuning-Schrauben maxmemory-samples lfu-decay-time, maxmemory-samples
Erklärbarkeit Sehr intuitiv Gut, mit Blick auf Decay

Performance-Auswirkungen in der Praxis

Bei kleinen Datensätzen bleibt der Unterschied oft gering; mit wachsender Größe trennt sich die Spreu. LRU überzeugt durch geringe CPU-Kosten der Approximation und klare Ursache: Ein Key fliegt, weil er zuletzt ungenutzt blieb. LFU punktet bei konsistenten Zugriffen, da Hot Keys sicher im RAM verbleiben und die Hit-Rate messbar steigt. Der Preis liegt im benötigten Verständnis für Zähler und Decay, damit du weder zu träge noch zu aggressiv reagierst. Ich prüfe die Effekte mit Profiling und Metriken, statt nur nach Gefühl zu entscheiden.

Plane außerdem den Cold-Start ein: Nach Neustarts oder Deployments ist der Cache leer oder „unwissend“ über Häufigkeiten. LRU stabilisiert sich schnell über kurzfristige Lokalität. LFU braucht naturgemäß ein gewisses Aufwärmen, um echte Hot Keys zu identifizieren. Strategien wie Prewarming (wichtige Schlüssel proaktiv laden) oder ein gestaffeltes Traffic-Ramping helfen, die anfängliche Latenz und Misses zu dämpfen.

Konfiguration und Tuning: die wichtigsten Optionen

Ich wähle die Policy über maxmemory-policy, typischerweise allkeys-lru oder allkeys-lfu, seltener volatile-Varianten mit TTL-Fokus. Mit maxmemory lege ich die harte Grenze fest, ab der Eviction startet, und dimensioniere sie abhängig vom Datensatz plus Sicherheitsmarge. Die Stichprobengröße steuere ich über maxmemory-samples; höhere Werte verbessern die Auswahl, brauchen aber CPU. Für LFU ist lfu-decay-time zentral, weil sie festlegt, wie schnell alte Zugriffe verblassen und neue Gewicht bekommen. Eine ausführliche Anleitung zur Speicherdimensionierung findest du hier: Speicher optimal konfigurieren.

Konkrete Rezepte für die Praxis

Für einen schnellen Start arbeite ich mit klaren Defaults und iteriere unter Last:

  • allkeys-lru + maxmemory-samples 7–10 für volatile, benutzernahe Daten
  • Redis LFU (allkeys-lfu) + lfu-decay-time konservativ (z. B. moderater Wert) für stabile Hot-Key-Workloads

Konfiguration zur Laufzeit setzen:

CONFIG SET maxmemory 8gb
CONFIG SET maxmemory-policy allkeys-lru
CONFIG SET maxmemory-samples 10
# Wechsel zu LFU:
CONFIG SET maxmemory-policy allkeys-lfu
CONFIG SET lfu-decay-time 5

In redis.conf definierst du die gleichen Optionen dauerhaft. Ich teste Änderungen zuerst in Staging mit repräsentativer Last, bevor ich sie in Produktion übernehme.

Größe der Stichprobe wählen

maxmemory-samples ist eine solide Stellschraube: Höhere Werte verbessern die Trefferqualität der Eviction-Kandidaten, kosten aber CPU. Als Faustregel starte ich mit 7–10 bei großen Keyspaces und reduziere nur, wenn CPU-Zeit knapp wird. Bei kleinen Keyspaces reichen oft 5 Proben.

Monitoring und Metriken: messen statt raten

Ich beobachte dauerhaft Hit-Rate, Evictions/s, Latenzen und Speicherbelegung, um das Zusammenspiel zu beurteilen. Steigen Evictions stark, prüfe ich RAM-Reserven, TTL-Strategien und die gewählte Policy. Eine abfallende Hit-Rate zeigt oft, dass Musterwechsel die aktuelle Policy schwächen oder dass Datensätze nicht getrennt genug gecacht werden. Latenzspitzen weisen manchmal auf zu kleine Samples oder auf eine zu aggressive Eviction hin. Regelmäßige Lasttests helfen mir, die richtige Balance zwischen CPU-Aufwand, Speichergrenze und Trefferquote zu finden.

Praktische Kommandos für schnelle Checks:

INFO stats     # keyspace_hits, keyspace_misses, evicted_keys, expired_keys
INFO memory    # used_memory, fragmentation, allocator_overhead
LATENCY DOCTOR # Hinweise zu Spitzen, z. B. Forking oder I/O

Die Hit-Rate berechne ich als hits / (hits + misses). Eine sinkende Quote bei anziehenden Evictions ist ein Warnsignal. evicted_keys in Relation zu Traffic und used_memory zeigt, ob die Policy häufig aktiv werden muss. Mit MEMORY USAGE key identifizierst du übergroße Objekte, die deinen Cache unverhältnismäßig dominieren.

Hosting- und Skalierungsaspekte: Plattform bewusst wählen

Redis entfaltet seine Stärken auf einer leistungsfähigen Plattform mit reichlich RAM, geringer Latenz und verlässlicher Netzwerkanbindung. Bei wachsenden Projekten vermeide ich Dauerbetrieb unter Volllast, weil Eviction dann zu häufig auslöst und die Hit-Rate leidet. Eine gute Hosting-Strategie sorgt dafür, dass Policies greifen, wenn nötig, und nicht permanent feuern. In Vergleichen setze ich auf Premium-Anbieter wie webhoster.de, deren Infrastruktur hohe Lasten sauber trägt und planbare Kapazität ermöglicht. So zahlt die Plattform direkt auf weniger Evictions, bessere Antwortzeiten und konstantere Performance ein.

Cluster- und Replika-Aspekte

In Sharding-Setups (z. B. Redis Cluster) greifen Eviction-Entscheidungen pro Knoten. Das heißt: Headroom, Policy und Tuning müssen je Node passen, nicht nur „im Schnitt“. Hot Keys, die ungleich über Slots verteilt sind, können einzelne Knoten früher an die Grenze bringen. Plane daher Puffer pro Shard und beobachte Evictions auf Knotenebene. Replikate übernehmen die Datenlage inklusive gelöschter Keys; beachte bei Lasttests, dass zusätzliche Replikation Latenzen erhöhen kann, ohne dass die Policy selbst schuld ist.

TTL-Strategien und gemischte Policies

Mit TTL schütze ich langlebige Konfigurationen und priorisiere zeitkritische, kurzlebige Daten. Nutze ich volatile-lru oder volatile-lfu, verdrängt Redis nur Keys mit Ablaufzeit – hilfreich, wenn Cache und dauerhafte Werte zusammenleben. Ich trenne Caches oft nach Datentypen: Sessions auf LRU, Produktkataloge auf LFU, um die jeweiligen Stärken auszuspielen. Eine kluge TTL-Wahl verhindert, dass veraltete Einträge unnötig RAM binden und Evictions provozieren. So halte ich Speicher sauber, ohne nützliche Hot Keys zu verlieren.

Wichtig: Eine Policy gilt pro Instanz. Unterschiedliche Policies pro Datentyp erreichst du zuverlässig, indem du getrennte Redis-Instanzen oder klar abgegrenzte Caches betreibst. Namespaces allein ändern die Policy nicht; sie helfen aber beim gezielten Invalidieren und beim Messen.

Praxis-Check: Start mit LRU, gezielter Wechsel zu LFU

Ich beginne häufig mit LRU, weil es intuitiv ist und schnell Ergebnisse liefert. Danach identifiziere ich Caches mit dauerhaften Hot Keys und stelle selektiv auf LFU um. Dieser Weg minimiert Risiko, weil du nur dort änderst, wo Datenmuster die Frequenzlogik wirklich belohnen. Mit Canaries und A/B-Tests messe ich Hit-Rate und Latenz vor und nach der Umstellung. So optimiere ich Schritt für Schritt, statt die gesamte Plattform auf einen Schlag umzurüsten.

Ein erprobter Migrationspfad

  • Baseline schaffen: aktuelle Hit-Rate, Evictions/s, 95.-/99.-Perzentil der Latenz erfassen.
  • Pilot-Cache auswählen: stabiler, leselastiger Bereich mit klaren Hot Keys.
  • LFU aktivieren, lfu-decay-time konservativ setzen, maxmemory-samples erhöhen.
  • Warm-up-Phase einplanen und beobachten, bis sich Zähler gefestigt haben.
  • Metriken vergleichen, erst danach Tuning in kleinen Schritten vornehmen.

Häufige Stolpersteine in Apps (z. B. WordPress)

In Content-Systemen führen falsche TTLs und ungeeignete Keys schnell zu Eviction-Fluten. Prüfe, ob dynamische Seiten unabsichtlich gecacht werden oder ob zu große Werte den Speicher sprengen. Achte auf sauberes Invalidate-Verhalten nach Publikationen, damit veraltete Inhalte verschwinden und Platz frei wird. Für typische Fehlerbilder im CMS-Umfeld hilft dir dieser Leitfaden weiter: Object Cache Fehler. Wenn du sauber invalidierst, realistische TTLs setzt und die richtige Policy wählst, steigen Hit-Rate und Schnelligkeit messbar.

Weitere Anti-Patterns aus der Praxis:

  • Große Einzelobjekte (z. B. riesige JSON-Blobs) verdrängen viele kleine, nützliche Keys. Lösung: Daten zerschneiden, nur tatsächlich genutzte Segmente cachen.
  • Thundering Herd: Viele gleichzeitige Misses für denselben Key. Lösung: Request-Coalescing/Locks, kurze Jitter bei TTLs, damit Erneuerungen verteilt passieren.
  • Scan-Pollution: Batch-Reads ohne Wiederverwendung. Lösung: Separate Instanz/Namespace, LRU dort mit großzügigerem Speicher oder die Workloads bewusst nicht cachen.
  • Unklare Invalidierung: Alte Versionen füllen den Cache. Lösung: Klare Key-Schemata (z. B. Versionspräfixe) und deterministische Invalidate-Pfade.

Zusammenfassung: So treffe ich die Wahl

Ich setze LRU ein, wenn Aktualität die beste Heuristik für künftige Zugriffe liefert – etwa bei Sessions, Dashboards und Live-APIs. Ich greife zu LFU, wenn klare, dauerhafte Hot Keys bestehen, die ich auch bei Lastspitzen schützen will. Monitoring zeigt mir, ob Evictions überhandnehmen oder die Hit-Rate fällt; dann justiere ich Samples, TTLs und Decay. Mit sauberer Plattformwahl, kluger Speichergrenze und getrennten Caches pro Datentyp hole ich konstant mehr heraus. So bleibt der Cache schnell, planbar und passend zum Zugriffsmuster – ganz ohne Rätselraten.

Aktuelle Artikel

Visualisierung eines Redis-Caches mit Servern und Datenströmen zur Darstellung von LFU und LRU Eviction Policies
Datenbanken

Redis LFU vs LRU: Welche Eviction-Policy ist die richtige?

Um deinen Cache optimal zu konfigurieren, solltest du verstehen, wie redis eviction mit Redis LFU und Redis LRU funktioniert – dieser Artikel zeigt dir den direkten Vergleich und hilft bei der Policy-Wahl.