Konfiguration von Redis als effizienter mehrschichtiger Cache
Konfigurieren Sie Redis-Cache-Speichergrenzen, Räumungsrichtlinien, TTLs und Persistenzoptionen für einen zuverlässigen mehrschichtigen Cache.
Konfiguration von Redis als effizienter mehrschichtiger Cache
Redis ist schnell, weil es Arbeitsdaten im Speicher hält, aber ein unverwalteter Cache kann dennoch den Host füllen und zu fehlgeschlagenen Schreibvorgängen führen. Wenn Sie Redis als mehrschichtigen Cache zwischen Ihrer Anwendung und einer langsameren Datenbank verwenden, sind die wichtigsten Entscheidungen Speichergrenzen, Räumungsrichtlinie, TTL-Disziplin und ob Cache-Daten überhaupt persistiert werden sollen.
Dieser Leitfaden konzentriert sich auf die Redis-Konfiguration für Cache-Workloads, nicht für die primäre Datenspeicherung.
Verständnis der Redis-Caching-Ebenen
In vielen Anwendungsdesigns ist Redis der gemeinsame Cache hinter einem kleineren prozessinternen Cache. Ihre Anwendung kann einige wenige heiße Werte für Millisekunden lokal speichern, während Redis einen größeren Satz wiederverwendbarer Objekte für Sekunden oder Minuten speichert. Das macht Redis zur Schicht, die Ihre Datenbank schützt, wenn der Datenverkehr ansteigt.
Eine effiziente Konfiguration hängt von zwei Kernbereichen ab:
- Speicherverwaltung: Festlegen einer harten Grenze dafür, wie viel Speicher Redis verbrauchen kann.
- Räumungsrichtlinien: Bestimmen, wie Redis entscheidet, welche Schlüssel entfernt werden sollen, wenn die Speichergrenze erreicht ist.
1. Festlegen von Speichergrenzen für Stabilität
Zu verhindern, dass Redis den gesamten verfügbaren Systemspeicher verbraucht, ist für die Host-Stabilität von größter Bedeutung. Die Direktive maxmemory setzt eine absolute Obergrenze für den Speicher, der dem Datensatz zugewiesen ist (ohne Overhead). Wenn diese Grenze erreicht ist, beginnt Redis, Schlüssel basierend auf der konfigurierten Richtlinie zu räumen.
Konfigurationsdirektive: maxmemory
Diese Einstellung ist für Produktionsumgebungen entscheidend. Eine gängige bewährte Methode ist, etwas Spielraum für Betriebssystemaufgaben und Redis-Overhead (z. B. interne Datenstrukturen, Replikationspuffer) zu lassen.
Beispielkonfiguration (redis.conf):
# Setzen der maximalen Speichernutzung auf 4 Gigabyte
maxmemory 4gb
Tipp: Verwenden Sie immer menschenlesbare Suffixe (z. B.
100mb,2gb) für eine einfachere Konfigurationsverwaltung.
Durchsetzung der Speicherrichtlinie
Wenn maxmemory gesetzt ist und maxmemory-policy auf noeviction bleibt, können Befehle, die mehr Speicher benötigen, fehlschlagen, sobald die Grenze erreicht ist. Wählen Sie für einen Cache eine Räumungsrichtlinie, die es Redis ermöglicht, alte Cache-Einträge zu verwerfen, anstatt normale Cache-Schreibvorgänge abzulehnen.
2. Auswahl der richtigen Räumungsrichtlinie (maxmemory-policy)
Diese Direktive definiert den Algorithmus, den Redis verwendet, um auszuwählen, welche Schlüssel entfernt werden sollen, wenn die Speichergrenze überschritten wird. Die Wahl der richtigen Richtlinie hängt stark von den Zugriffsmustern Ihrer Anwendungsdaten ab.
Flüchtige vs. nicht-flüchtige Richtlinien
Richtlinien werden im Allgemeinen danach kategorisiert, ob sie die auf den Schlüsseln gesetzte Time-To-Live (TTL)-Ablaufzeit berücksichtigen:
- Flüchtig: Berücksichtigt nur Schlüssel, die eine Ablaufzeit gesetzt haben (
EXPIREoderSETEX). - Alle Schlüssel: Berücksichtigt alle Schlüssel, unabhängig von der TTL.
Für eine reine Caching-Ebene, bei der die meisten Elemente ein explizites Ablaufdatum haben, sind flüchtige Richtlinien hervorragend geeignet. Wenn Sie sich auf externe Anwendungslogik zur Verwaltung der Veralterung verlassen, bevorzugen Sie möglicherweise nicht-flüchtige Richtlinien.
Erläuterung der wichtigsten Räumungsalgorithmen
A. Least Recently Used (LRU)
Dies ist die häufigste und oft standardmäßige Richtlinie für allgemeines Caching. Sie entfernt den Schlüssel, der am längsten nicht zugegriffen wurde. Sie funktioniert am besten, wenn Zugriffsmuster dem Prinzip der zeitlichen Lokalität folgen (kürzlich zugegriffene Daten werden wahrscheinlich bald wieder zugegriffen).
Konfiguration:
maxmemory-policy allkeys-lru
B. Least Frequently Used (LFU)
LFU verfolgt, wie oft auf einen Schlüssel zugegriffen wurde. Es räumt Schlüssel mit einer niedrigeren geschätzten Zugriffshäufigkeit. Dies funktioniert gut, wenn Ihre Arbeitslast einen stabilen Satz beliebter Schlüssel hat, die gelegentliche Scans oder einmalige Lesevorgänge überleben sollten.
Konfiguration:
maxmemory-policy allkeys-lfu
C. TTL-basierte Räumung
TTL-basierte Räumung ist nützlich, wenn Schlüssel sinnvolle Ablaufzeiten haben und die Schlüssel, die dem Ablauf am nächsten sind, am sichersten zu entfernen sind.
Konfiguration:
maxmemory-policy volatile-ttl
Diese Richtlinie berücksichtigt nur Schlüssel mit einer gesetzten Ablaufzeit. Wenn viele Schlüssel keine TTL haben, kann Redis möglicherweise keine räumbaren Schlüssel mehr haben und Schreibvorgänge ablehnen.
D. Zufällige Räumung
Zufällige Räumung ist einfach und manchmal für wegwerfbare Cache-Daten akzeptabel, aber sie ist selten die erste Wahl, wenn Ihr Cache klare Zugriffsmuster hat.
maxmemory-policy allkeys-random
3. Setzen Sie TTLs konsistent
Räumungsrichtlinien sind ein Druckentlastungsventil, nicht Ihre einzige Cache-Invalidierungsstrategie. Die meisten Cache-Schlüssel sollten eine Ablaufzeit haben, die dem Geschäftswert der Daten entspricht.
Zum Beispiel könnte eine Produktdetailseite ein gerendertes Fragment für fünf Minuten cachen:
redis-cli SET product:123:html "$HTML" EX 300
Eine Benutzerberechtigungsabfrage benötigt möglicherweise eine viel kürzere TTL, da veraltete Daten riskanter sind:
redis-cli SET user:42:permissions "$JSON" EX 30
Vermeiden Sie es, permanente Schlüssel mit wegwerfbaren Cache-Schlüsseln in derselben Redis-Datenbank zu mischen, es sei denn, Sie verwenden eine allkeys-*-Richtlinie und sind damit einverstanden, dass jeder Schlüssel geräumt werden kann. Wenn einige Daten niemals geräumt werden dürfen, bewahren Sie sie in einer separaten Redis-Instanz oder Datenbank mit einer anderen Richtlinie auf.
4. Entscheiden Sie, ob Cache-Persistenz hilft
Für einen reinen Cache ist Redis-Persistenz optional. Das Deaktivieren von RDB und AOF reduziert die Festplatten-E/A und die Neustartkomplexität, aber jeder Cache-Schlüssel geht verloren, wenn Redis neu startet.
save ""
appendonly no
Das ist akzeptabel, wenn Ihre Anwendung den Cache aus der Datenbank neu aufbauen kann. Wenn das Aufwärmen des Caches teuer ist oder ein kalter Cache die Datenbank überlasten würde, behalten Sie RDB-Snapshots oder AOF aktiviert und testen Sie das Neustartverhalten unter Last.
5. Überwachen Sie die Cache-Gesundheit
Verwenden Sie Redis-Metriken, um zu bestätigen, dass der Cache hilft:
redis-cli INFO memory
redis-cli INFO stats
redis-cli INFO keyspace
Beobachten Sie insbesondere diese Felder:
| Metrik | Was sie Ihnen sagt |
|---|---|
used_memory_human |
Aktueller von Redis verbrauchter Speicher. |
maxmemory_human |
Konfigurierte Speicherobergrenze. |
evicted_keys |
Ob Redis unter Druck räumt. |
keyspace_hits und keyspace_misses |
Ob der Cache nützliche Lesevorgänge bedient. |
expired_keys |
Ob die TTL-Bereinigung aktiv ist. |
Wenn evicted_keys schnell ansteigt und die Trefferquote sinkt, erhöhen Sie den Speicher, verkürzen Sie die TTLs für Schlüssel mit geringem Wert oder teilen Sie laute Workloads in einen separaten Cache auf.
Beispiel-Cache-Konfiguration
Dies ist ein vernünftiger Ausgangspunkt für eine Redis-Instanz, die für wegwerfbare Cache-Einträge dediziert ist:
maxmemory 4gb
maxmemory-policy allkeys-lfu
save ""
appendonly no
Für einen Cache, bei dem jeder Schlüssel eine sorgfältig gewählte TTL hat:
maxmemory 4gb
maxmemory-policy volatile-ttl
Verwenden Sie CONFIG GET maxmemory maxmemory-policy, um die aktiven Einstellungen zu überprüfen:
redis-cli CONFIG GET maxmemory maxmemory-policy
Fazit
Behandeln Sie die Redis-Cache-Konfiguration als ein Kapazitätskontrollproblem. Setzen Sie maxmemory, wählen Sie eine Räumungsrichtlinie, die zu Ihrem Zugriffsmuster passt, geben Sie Cache-Schlüsseln explizite TTLs und entscheiden Sie, ob Persistenz die Festplatten-E/A wert ist. Überwachen Sie dann die Trefferquote, Räumungen und das Speicherwachstum, damit der Cache Ihre Datenbank schützt, anstatt zum nächsten Engpass zu werden.