Was ist ein Cache?
Datenbankabfragen und Aufrufe externer APIs sind CPU- und netzwerkintensiv und können mehrere Sekunden dauern. Wenn Sie dieselben Daten wiederholt abrufen, können Sie das Ergebnis in einem Cache ablegen und nachfolgende Anfragen so deutlich beschleunigen. Laravel bietet eine einheitliche API für viele verschiedene Cache-Backends, darunter Memcached, Redis, DynamoDB und relationale Datenbanken.Standardmäßig ist der Treiber
database konfiguriert. Durch einen Wechsel zu Redis oder Memcached lässt sich der Cache noch weiter beschleunigen.Cache konfigurieren
config/cache.php
Alle Cache-Einstellungen sind inconfig/cache.php gebündelt.
Der Standardtreiber wird über die Umgebungsvariable CACHE_STORE gewechselt.
Verfügbare Treiber
database (Standard)
database (Standard)
Speichert serialisierte Cache-Daten in einer Datenbanktabelle.
Ab Laravel 11 ist die passende Migration in neuen Projekten bereits enthalten.Fehlt die Migration, erzeugen Sie sie über einen Artisan-Befehl.
file
file
Speichert Cache-Daten im Dateisystem.
Er benötigt keine zusätzliche Einrichtung und eignet sich für kleinere Anwendungen.
redis
redis
Ein schneller, im Arbeitsspeicher laufender Cache-Treiber.
Er wird in der Produktion am häufigsten eingesetzt und benötigt entweder die PHP-Erweiterung PhpRedis oder das Paket
predis/predis.memcached
memcached
Erfordert das PECL-Paket Memcached.
Konfigurieren Sie die Server in
config/cache.php.dynamodb
dynamodb
Verwendet AWS DynamoDB als Cache-Store.
Erstellen Sie vorab die DynamoDB-Tabelle und installieren Sie das AWS SDK.
storage
storage
Nutzt eine beliebige Filesystem-Disk als Key-Value-Cache-Store.
Praktisch, wenn Sie eine bestehende S3-Disk direkt für den Cache verwenden möchten.
array / null (für Tests)
array / null (für Tests)
Der Treiber
array ist ein In-Memory-Cache, der nur innerhalb eines Requests gültig ist.
null ignoriert alle Operationen. Beide sind für automatisierte Tests nützlich.Hierarchie der Cache-Treiber
Wählen Sie den Treiber passend zu Ihrem Einsatzzweck und der gewünschten Geschwindigkeit.Grundlegende Operationen
Die Cache-Facade beziehen
Über die FacadeCache greifen Sie auf den Cache zu.
store().
Werte lesen: Cache::get()
Mit get() lesen Sie einen Wert aus dem Cache.
Ist der Schlüssel nicht vorhanden, wird null zurückgegeben. Sie können auch einen Standardwert angeben.
Werte speichern: Cache::put()
put() legt einen Wert im Cache ab. Der dritte Parameter ist die Gültigkeitsdauer in Sekunden.
add() speichern Sie nur, wenn der Schlüssel noch nicht existiert.
forever().
Lesen oder speichern: Cache::remember()
Das ist die am häufigsten verwendete Operation. Ist der Wert im Cache vorhanden, wird er zurückgegeben; andernfalls wird die Closure ausgeführt und ihr Ergebnis gespeichert.
Ablauf von remember()
Es gibt auchrememberForever() für dauerhaftes Speichern.
rememberWithWarmth(). Die Methode liefert ein Array mit dem Cache-Wert und einem Boolean, der angibt, ob der Wert „frisch” aus dem Cache stammt.
Stale While Revalidate (flexible Cache-Aktualisierung)
Cache::flexible() erwartet ein Array aus zwei Zeitfenstern: „frisch” und „veraltet, aber noch verwendbar”.
Nutzern werden ggf. veraltete Daten zurückgegeben, während der Cache im Hintergrund aktualisiert wird.
Existenzprüfung: Cache::has()
Werte inkrementieren / dekrementieren
Sie können Zähler mit ganzzahligen Werten steuern.Lesen und löschen: Cache::pull()
Liest den Wert aus und löscht ihn anschließend aus dem Cache. Praktisch für Einmaldaten.
Werte löschen: Cache::forget()
Cache::flushLocks() können Sie alle atomaren Locks im Cache entfernen.
TTL verlängern: Cache::touch()
Verlängert die Gültigkeitsdauer eines bestehenden Cache-Eintrags.
Cache-Memoisierung
Mit dem Treibermemo werden Cache-Zugriffe innerhalb eines einzigen Requests im Speicher zwischengespeichert.
Damit vermeiden Sie überflüssige Roundtrips zum Cache-Store, wenn derselbe Schlüssel mehrfach abgefragt wird.
Cache-Tags
Sie können zusammengehörige Cache-Einträge über Tags gruppieren und gemeinsam löschen.Aufbau von getaggten Caches
Ein mit mehreren Tags versehener Cache-Eintrag kann über jeden dieser Tags gemeinsam mit anderen entfernt werden.Getaggte Werte schreiben und lesen
Getaggte Werte löschen
Atomare Operationen (Locks)
MitCache::lock() implementieren Sie verteilte Locks, um Race Conditions zwischen Prozessen oder parallelen Anfragen zu vermeiden.
Dieses Feature steht bei den Cache-Treibern
memcached, redis, dynamodb, database, file und array zur Verfügung. Alle Server müssen mit demselben zentralen Cache-Server kommunizieren.Grundlegender Lock
Auf einen Lock warten
Wartet bis zu der angegebenen Anzahl an Sekunden, bis der Lock erworben werden kann. Bei einem Timeout wirdLockTimeoutException ausgelöst.
Doppelte Ausführung verhindern: withoutOverlapping()
Ein einfacher Weg, um zu verhindern, dass derselbe Prozess mehrfach parallel läuft.
Parallelität begrenzen: funnel()
Begrenzt die Anzahl gleichzeitig ausführbarer Verarbeitungen.
Locks zwischen Prozessen übergeben
Erwerben Sie einen Lock in einem Web-Request und geben Sie ihn in einem Queue-Job wieder frei.forceRelease.
Locks auffrischen
Um die Gültigkeitsdauer eines gerade gehaltenen Locks zu verlängern, verwenden Sie die Methoderefresh. Ohne Angabe einer Dauer wird die ursprüngliche Gültigkeitsdauer erneut verwendet. Nützlich, wenn Sie einen kurzen Lock während einer langen Verarbeitung regelmäßig verlängern möchten, ohne von Anfang an eine sehr lange Gültigkeit setzen zu müssen.
Cache-Helper
Mit der Hilfsfunktioncache() können Sie dieselben Operationen wie mit der Cache-Facade in kürzerer Form ausführen.
Praxisbeispiele
Datenbank-Ergebnisse cachen
1
Datenbank-Ergebnisse im Controller cachen
2
Cache invalidieren, wenn Daten aktualisiert werden
Eloquent-Modelle cachen
API-Antworten cachen
Gruppen-Management mit Cache-Tags
Zusammenfassung
Häufig genutzte Methoden
Häufig genutzte Methoden
Wahl des Treibers
Wahl des Treibers
- Entwicklung / kleine Anwendungen:
fileoderdatabase - Produktion / hohe Last:
redis(in Kombination mit Laravel Horizon einfach überwachbar) - AWS-Umgebung:
dynamodboderstorage(bei Wiederverwendung einer S3-Disk) - Tests:
arrayodernull
Best Practices
Best Practices
- Wählen Sie Cache-Schlüssel so, dass sie im gesamten Projekt eindeutig sind (z. B.
users:1:profile). - Invalidieren Sie den Cache nach Datenänderungen mit
Cache::forget()oderCache::tags()->flush(). - Wählen Sie die TTL angemessen – nicht zu kurz, nicht zu lang – und richten Sie sie an der Änderungsfrequenz der Daten aus.
- Mit
Cache::remember()behandeln Sie Cache-Misses besonders kompakt. - Verwenden Sie in der Produktion Redis und ziehen Sie eine Failover-Konfiguration in Betracht.