Leitfaden zur Auswahl effektiver Redis-Räumungsrichtlinien
Wählen Sie eine Redis-Räumungsrichtlinie, die zu Ihrem Cache-, Sitzungs- oder gemischten Workload passt, und passen Sie maxmemory an, ohne wichtige Schlüssel zu verlieren.
Leitfaden zur Auswahl effektiver Redis-Räumungsrichtlinien
Redis ist schnell, weil es Daten im Speicher hält, aber der Speicher ist begrenzt. Wenn Ihre Redis-Instanz maxmemory erreicht, entscheidet die Räumungsrichtlinie, ob Redis Schlüssel entfernt, Schreibvorgänge ablehnt oder nur Schlüssel mit einer Ablaufzeit räumt.
Die Auswahl einer effektiven Redis-Räumungsrichtlinie ist am wichtigsten, wenn Redis als Cache, Sitzungsspeicher oder gemischter Datenspeicher fungiert. Die falsche Richtlinie kann wichtige Schlüssel räumen oder Schreibvorgänge während eines Verkehrsspitzenwerts fehlschlagen lassen.
Grundlegendes zu Redis-Räumung und maxmemory
Räumungsrichtlinien kommen nur dann zum Tragen, wenn die Redis-Speichernutzung das mit der Konfigurationsdirektive maxmemory festgelegte Limit überschreitet. Wenn maxmemory nicht gesetzt oder auf 0 gesetzt ist, wendet Redis kein Speicherlimit für normale Schreibvorgänge an. Auf einem dedizierten Host kann dies schließlich zu Speicherdruck des Betriebssystems führen, daher legen Produktions-Cache-Bereitstellungen normalerweise ein explizites Limit fest.
Um die Räumung zu aktivieren, müssen Sie maxmemory in Ihrer redis.conf-Datei oder über den Befehl CONFIG SET konfigurieren:
# Setzen Sie maxmemory auf 2 GB
CONFIG SET maxmemory 2gb
Sobald der Speicher begrenzt ist, verwendet Redis die konfigurierte Räumungsrichtlinie, um zu entscheiden, welche Schlüssel verworfen werden sollen, wenn ein Schreibbefehl mehr Speicher benötigt.
Die integrierten Redis-Räumungsrichtlinien
Redis bietet mehrere verschiedene Richtlinien. Diese werden mit der Direktive maxmemory-policy konfiguriert. Die Richtlinien fallen im Allgemeinen in zwei Kategorien: solche, die auf Least Recently Used (LRU) oder Least Frequently Used (LFU) basieren, und solche, die auf Schlüssel mit Time To Live (TTL) abzielen.
1. Richtlinien ohne TTL-Anforderungen
Diese Richtlinien gelten für alle Schlüssel in der Datenbank, unabhängig davon, ob für sie eine Ablaufzeit festgelegt ist.
noeviction
Dies ist die Standardrichtlinie. Wenn das Speicherlimit erreicht ist, lehnt Redis Schreibbefehle (wie SET, LPUSH usw.) ab und gibt einen Fehler an den Client zurück. Lesevorgänge (GET) sind weiterhin erlaubt. Dies ist oft für unternehmenskritische Daten geeignet, bei denen Datenverlust inakzeptabel ist, kann jedoch bei hohem Schreibdruck zu Anwendungsfehlern führen.
allkeys-lru
Räumt die am wenigsten zuletzt verwendeten Schlüssel unter allen Schlüsseln in der Datenbank, bis die Speichernutzung unter dem maxmemory-Limit liegt. Dies ist die Standardwahl für einen allgemeinen Cache, bei dem alle Datenobjekte gleichermaßen cachebar sind.
allkeys-lfu
Räumt die am wenigsten häufig verwendeten Schlüssel unter allen Schlüsseln. LFU priorisiert das Behalten von Schlüsseln, die oft zugegriffen werden, auch wenn sie nicht kürzlich zugegriffen wurden. Dies ist effektiv, wenn Zugriffsmuster volatil sind, aber sehr beliebte Elemente möglicherweise auf unbestimmte Zeit resident bleiben.
allkeys-random
Räumt zufällig ausgewählte Schlüssel, bis das Speicherlimit erfüllt ist. Dies wird selten für Produktions-Caches empfohlen, es sei denn, das Datenzugriffsmuster ist vollständig gleichmäßig und unvorhersehbar.
2. Richtlinien, die TTL erfordern (flüchtige Schlüssel)
Diese Richtlinien berücksichtigen nur Schlüssel, die eine explizite Ablaufzeit (EXPIRE oder SETEX) haben. Sie ignorieren nicht ablaufende Schlüssel bei der Durchführung der Räumung.
volatile-lru
Räumt die am wenigsten zuletzt verwendeten Schlüssel unter denen, die eine Ablaufzeit haben.
volatile-lfu
Räumt die am wenigsten häufig verwendeten Schlüssel unter denen, die eine Ablaufzeit haben.
volatile-random
Räumt einen zufälligen Schlüssel unter denen, die eine Ablaufzeit haben.
volatile-ttl
Räumt zuerst den Schlüssel mit der kürzesten verbleibenden Time to Live (TTL). Dies ist ideal für zeitkritische Daten wie Sitzungstoken oder temporären Anwendungsstatus, um sicherzustellen, dass ältere, bald ablaufende Daten zuerst bereinigt werden.
Auswahl der richtigen Richtlinie für Ihren Workload
Die optimale Räumungsrichtlinie hängt vollständig davon ab, was Sie cachen und wie Ihre Anwendung die Daten verwendet.
| Workload-Typ | Empfohlene Richtlinie | Begründung |
|---|---|---|
| Allgemeiner Cache (am häufigsten) | allkeys-lru |
Geht davon aus, dass ältere, ungenutzte Daten zuerst entfernt werden sollten, unabhängig von der TTL. Einfach und hochwirksam. |
| Zeitkritische Daten (z. B. Token, kurzlebige Sitzungen) | volatile-ttl |
Räumt bevorzugt Schlüssel mit der kürzesten verbleibenden TTL. |
| Hot-Data-Cache (Hohe Zugriffsverzerrung) | allkeys-lfu oder volatile-lfu |
Schützt häufig zugegriffene Elemente davor, aufgrund kürzlicher Inaktivität geräumt zu werden. |
| Verbindliche Datenaufbewahrung (Kein Verlust erlaubt) | noeviction |
Verhindert Datenverlust, indem Schreibvorgänge mit Fehlern abgelehnt werden, was manuelles Eingreifen oder die Behandlung durch die vorgelagerte Anwendung erfordert. |
| Gemischte Workloads (Einige Daten laufen ab, andere nicht) | volatile-lru, volatile-lfu oder volatile-ttl |
Wenn Ihre nicht ablaufenden Schlüssel wesentlich sind, verwenden Sie eine flüchtige Richtlinie, um sie zu schützen, indem Sie nur explizit ablaufende Schlüssel räumen. |
Praktisches Beispiel: Implementierung eines Sitzungsspeichers
Wenn Redis hauptsächlich zum Speichern von Benutzersitzungen verwendet wird, setzen Sie für jeden Sitzungsschlüssel eine explizite TTL, z. B. 30 Minuten. volatile-ttl kann funktionieren, wenn die verbleibende Lebensdauer das wichtigste Signal ist. Wenn Ihre Anwendung Sitzungs-TTLs bei Aktivität aktualisiert, behalten aktive Sitzungen auf natürliche Weise eine längere verbleibende TTL. Wenn sie keine TTLs aktualisiert, ziehen Sie stattdessen volatile-lru oder volatile-lfu in Betracht.
# 1. Setzen Sie maxmemory (z. B. 10 GB)
CONFIG SET maxmemory 10gb
# 2. Wählen Sie die Richtlinie, die auf Time-to-Live-Daten abzielt
CONFIG SET maxmemory-policy volatile-ttl
Praktisches Beispiel: Implementierung eines HTTP-Caches
Zum Cachen vollständiger HTTP-Antworten (die möglicherweise nicht immer eine TTL haben) möchten Sie die Daten behalten, auf die am häufigsten zugegriffen wird, auch wenn diese Daten einige Stunden unberührt waren. allkeys-lru oder allkeys-lfu sind ideal.
# Verwenden Sie LFU, um wirklich 'heiße' Objekte zu behalten, unabhängig von ihrer Erstellungszeit
CONFIG SET maxmemory-policy allkeys-lfu
Überwachung und Optimierung
Nach der Auswahl einer Richtlinie ist eine kontinuierliche Überwachung unerlässlich. Sie sollten die folgenden Metriken über den Befehl INFO verfolgen:
used_memory: Wie nah Sie ammaxmemory-Limit sind.evicted_keys: Die Rate, mit der Redis Daten verwirft. Eine konstant hohe Räumungsrate zeigt an, dass Ihremaxmemory-Einstellung für Ihren Workload zu niedrig ist oder Ihre Räumungsrichtlinie zu aggressiv ist.- Anwendungs-Cache-Trefferquote: Das ultimative Erfolgsmaß. Wenn Ihre Trefferquote bei steigendem Speicherdruck sinkt, müssen Ihre Richtlinienauswahl oder Ihr
maxmemory-Limit angepasst werden.
Best Practice: Lassen Sie beim Optimieren von
maxmemoryimmer einen Sicherheitspuffer (z. B. 10-20 % freien Speicher), um Replikationspufferung, Befehlspufferung und potenziellen Overhead durch die internen Datenstrukturen von Redis zu berücksichtigen.
Abschließende Erkenntnis
Beginnen Sie mit allkeys-lru für einen allgemeinen Cache, allkeys-lfu, wenn eine kleine Menge heißer Schlüssel den Verkehr dominiert, und einer volatile-*-Richtlinie nur, wenn nicht ablaufende Schlüssel geschützt werden müssen. Beobachten Sie dann evicted_keys, die Anwendungstrefferquote und Schreibfehler unter Last, bevor Sie die Richtlinie als abgeschlossen betrachten.