Skip to main content

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 in config/cache.php gebündelt. Der Standardtreiber wird über die Umgebungsvariable CACHE_STORE gewechselt.

Verfügbare Treiber

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.
Speichert Cache-Daten im Dateisystem. Er benötigt keine zusätzliche Einrichtung und eignet sich für kleinere Anwendungen.
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.
Erfordert das PECL-Paket Memcached. Konfigurieren Sie die Server in config/cache.php.
Verwendet AWS DynamoDB als Cache-Store. Erstellen Sie vorab die DynamoDB-Tabelle und installieren Sie das AWS SDK.
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.
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 Facade Cache greifen Sie auf den Cache zu.
Um zwischen mehreren Cache-Stores zu wählen, verwenden Sie die Methode 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.
Mit add() speichern Sie nur, wenn der Schlüssel noch nicht existiert.
Für ein dauerhaftes Speichern verwenden Sie 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.
Mit Cache::remember() fassen Sie die drei Schritte „Cache prüfen → bei Cache-Miss abrufen → im Cache speichern” in einer einzigen Zeile zusammen. Ideal zum Cachen von Datenbank-Ergebnissen und Antworten externer APIs.

Ablauf von remember()

Es gibt auch rememberForever() für dauerhaftes Speichern.
Möchten Sie wissen, ob es ein Cache-Treffer oder ein frisch berechneter Wert war, verwenden Sie rememberWithWarmth(). Die Methode liefert ein Array mit dem Cache-Wert und einem Boolean, der angibt, ob der Wert „frisch” aus dem Cache stammt.
rememberWithWarmth() eignet sich, um die Effizienz Ihres Caches zu beobachten. Ist $warm häufig false, können Sie die Gültigkeitsdauer (TTL) möglicherweise anpassen.

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::flush() löscht unabhängig von einem eingestellten Cache-„Präfix” alle Einträge. Wenn Sie sich einen Cache mit mehreren Anwendungen teilen, ist Vorsicht geboten.
Mit 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 Treiber memo 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.
Cache-Tags stehen bei den Treibern file, dynamodb, database und storage nicht zur Verfügung. Sie erfordern redis oder memcached.

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

Tags sind hilfreich, wenn Sie den Cache pro Gruppe – etwa pro Benutzer oder pro Beitrag – invalidieren möchten. Beispiel: Mit Cache::tags(['user', "user:{$userId}"])->flush() leeren Sie alle Cache-Einträge zu einer Benutzerin oder einem Benutzer.

Atomare Operationen (Locks)

Mit Cache::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

Übergeben Sie eine Closure, wird der Lock nach Abschluss automatisch freigegeben.

Auf einen Lock warten

Wartet bis zu der angegebenen Anzahl an Sekunden, bis der Lock erworben werden kann. Bei einem Timeout wird LockTimeoutException ausgelöst.
Mit einer Closure ist der Code kompakter.

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.
Um einen Lock unabhängig vom aktuellen Owner erzwungen freizugeben, verwenden Sie die Methode forceRelease.

Locks auffrischen

Um die Gültigkeitsdauer eines gerade gehaltenen Locks zu verlängern, verwenden Sie die Methode refresh. 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 Hilfsfunktion cache() 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

  • Entwicklung / kleine Anwendungen: file oder database
  • Produktion / hohe Last: redis (in Kombination mit Laravel Horizon einfach überwachbar)
  • AWS-Umgebung: dynamodb oder storage (bei Wiederverwendung einer S3-Disk)
  • Tests: array oder null
  • 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() oder Cache::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.
Zuletzt geändert am 13. Juli 2026