English | العربية | বাংলা | Bosanski | Deutsch | Español | Français | हिन्दी | Italiano | 日本語 | 한국어 | मराठी | Português | Русский | Kiswahili | தமிழ் | తెలుగు | Türkçe | اردو | Tiếng Việt | 中文
- Einführung
- Installation
- Nutzung
- Konfiguration
- Fortgeschrittene Nutzung
- Optimierung
- Häufige Muster
- Einschränkungen
- Support Richtlinien
- Lizenz - MIT Lizenz
Einführung
Recall ist ein leistungsstarkes Redis-Client-Cache-Paket für Laravel. Es nutzt die Funktion Client-Seitiges Caching von Redis 6 mit automatischer Invalidation, um die Anzahl der Redis-Round-Trips und die Latenz drastisch zu reduzieren. Speziell für Laravel Octane-Umgebungen entwickelt, verwendet es APCu oder Swoole Table als lokale Cache-Schicht, die durch Invalidierungsnachrichten mit Redis synchronisiert bleibt.
Wenn Sie einen Wert von Redis abrufen, speichert Recall ihn lokal. Wenn sich dieser Wert in Redis ändert (von einem beliebigen Client), benachrichtigt Redis Recall automatisch, den lokalen Kopie zu invalidieren. Dadurch erhalten Sie die Geschwindigkeit des In-Memory-Cache mit den Konsistenzgarantien von Redis.
Hauptmerkmale
- Automatische Invalidierung: Redis benachrichtigt Ihre Anwendung, wenn zwischengespeicherte Schlüssel sich ändern, wodurch die Cache-Kohärenz sichergestellt wird
- Keine Konfiguration erforderlich: Funktioniert sofort mit sinnvollen Standardeinstellungen
- Octane-Integration: Automatische Verbindungsaktivierung, anforderungsbasierte Invalidierungsverarbeitung und sanftes Herunterfahren
- Duale Treiberunterstützung: APCu für alle Octane-Server, Swoole Table für Swoole/OpenSwoole-Umgebungen
- Selektives Caching: Konfigurieren, welche Schlüsselpräfixe lokal zwischengespeichert werden sollen
- Schutz vor Race Conditions: Verfolgung ausstehender Anfragen verhindert das Zwischenspeichern veralteter Daten während gleichzeitiger Invalidierungen
Beispiel
// Konfigurieren Sie Recall als Ihren Cache-Treiber// config/cache.php'stores' => [ 'recall' => [ 'driver' => 'recall', ],], // Verwenden Sie es wie jeden Laravel-Cacheuse Illuminate\Support\Facades\Cache; // Erster Aufruf: abfragen aus Redis, lokal speichern$user = Cache::store('recall')->get('user:1'); // Nachfolgende Aufrufe: direkt aus dem lokalen APCu/Swoole Table (Mikrosekunden)$user = Cache::store('recall')->get('user:1'); // Wenn user:1 irgendwo aktualisiert wird, benachrichtigt Redis Recall zur InvalidierungCache::store('recall')->put('user:1', $newUserData, 3600);// Lokaler Cache wird automatisch auf allen Arbeitern ungültig
Installation
Installieren Sie das Paket über Composer:
composer require defectivecode/laravel-recall
Anforderungen
- PHP >= 8.4
- Laravel 11.x oder 12.x
- Laravel Octane
- Redis 6.0+ (für Unterstützung von Client-seitigem Caching)
- ext-apcu ODER ext-swoole (mindestens einer erforderlich für lokalen Cache)
Nutzung
Grundkonfiguration
- Fügen Sie den Recall-Cache-Store zu Ihrer
config/cache.phphinzu:
'stores' => [ // ... andere Stores 'recall' => [ 'driver' => 'recall', ],],
- Verwenden Sie den Cache-Store in Ihrer Anwendung:
use Illuminate\Support\Facades\Cache; // Speichern Sie einen Wert (schreibt in Redis)Cache::store('recall')->put('key', 'value', 3600); // Abrufen eines Wertes (der erste Aufruf trifft Redis, nachfolgende Aufrufe verwenden den lokalen Cache)$value = Cache::store('recall')->get('key'); // Löschen eines WertesCache::store('recall')->forget('key');
So funktioniert es
- Erster Lesevorgang: Wert wird aus Redis abgerufen und im lokalen APCu/Swoole Table-Cache gespeichert
- Nachfolgende Lesevorgänge: Wert wird direkt aus dem lokalen Speicher bereitgestellt (unterhalb von einer Millisekunde)
- Schreiben überall: Wenn ein beliebiger Client den Schlüssel in Redis ändert, sendet Redis eine Invalidierungsnachricht
- Automatische Invalidierung: Recall empfängt die Nachricht und entfernt den Schlüssel aus dem lokalen Cache
- Nächster Lesevorgang: Frischer Wert wird erneut aus Redis abgerufen und lokal zwischengespeichert
Dieses Muster ist besonders leistungsstark in Laravel Octane-Umgebungen, in denen Arbeiter zwischen Anfragen erhalten bleiben, da der lokale Cache aufbauen kann und viele Anfragen aus dem Speicher bedienen kann.
Octane-Integration
Recall integriert sich automatisch mit Laravel Octane, wenn verfügbar:
- Arbeiter starten: Stellt die Redis-Invalidierungsverbindung her (warm-up)
- Anfrage empfangen: Verarbeitet alle ausstehenden Invalidierungsnachrichten
- Arbeiter stoppen: Schließt Verbindungen sanft
Es ist keine zusätzliche Konfiguration erforderlich. Die Integration erfolgt automatisch, wenn Octane installiert ist.
Konfiguration
Veröffentlichen Sie die Konfigurationsdatei:
php artisan vendor:publish --tag=recall-config
Damit wird config/recall.php mit den folgenden Optionen erstellt:
Aktivieren/Deaktivieren
'enabled' => env('RECALL_ENABLED', true),
Wenn deaktiviert, leitet Recall direkt an Redis weiter, ohne die lokale Cache-Schicht zu verwenden. Nützlich zum Debuggen oder für eine schrittweise Einführung.
Redis-Store
'redis_store' => env('RECALL_REDIS_STORE', 'redis'),
Der Laravel-Cache-Store, der für Redis-Operationen verwendet werden soll. Dies sollte auf einen in Ihrer
config/cache.php konfigurierten Redis-Store verweisen.
Cache-Präfixe
'cache_prefixes' => [],
Nur Cache-Schlüssel, die diesen Präfixen entsprechen, lokal zwischenspeichern. Leer lassen, um alle Schlüssel zu zwischenspeichern.
// Nur Benutzer- und Einstellungen-Schlüssel lokal zwischenspeichern'cache_prefixes' => ['users:', 'settings:', 'config:'],
Dies ist nützlich, wenn Sie Schlüssel mit hohem Volumen haben, die sich häufig ändern und nicht lokal zwischengespeichert werden sollten.
Konfiguration des lokalen Caches
'local_cache' => [ // Treiber: "apcu" oder "swoole" 'driver' => env('RECALL_LOCAL_DRIVER', 'apcu'), // Präfix für lokale Cache-Schlüssel 'key_prefix' => env('RECALL_LOCAL_PREFIX', 'recall:'), // Standard-TTL in Sekunden (Sicherheitsnetz, falls Invalidierung verpasst wird) 'default_ttl' => (int) env('RECALL_LOCAL_TTL', 3600), // Swoole Table-Größe (Powers von 2, nur für Swoole-Treiber) 'table_size' => (int) env('RECALL_SWOOLE_TABLE_SIZE', 65536), // Max. Bytes pro Wert in der Swoole-Tabelle (nur für Swoole-Treiber) 'value_size' => (int) env('RECALL_SWOOLE_VALUE_SIZE', 8192),],
APCu-Treiber (Standard)
Der APCu-Treiber funktioniert mit allen PHP-Umgebungen und Octane-Servern (Swoole, RoadRunner, FrankenPHP). Er speichert zwischengespeicherte Werte im gemeinsamen Speicher, der für alle PHP-Prozesse zugänglich ist.
Anforderungen:
- ext-apcu installiert und aktiviert
apc.enable_cli=1in php.ini für die CLI-Nutzung
Swoole Table-Treiber
Der Swoole Table-Treiber verwendet die gemeinsamen Speichertabellen von Swoole, was konsistenten Zugriff über Koroutinen innerhalb des gleichen Arbeiters ermöglicht. Am besten für Swoole/OpenSwoole-Umgebungen geeignet.
Konfigurationstipps:
table_size: Muss eine Potenz von 2 sein (z. B. 65536, 131072). Bestimmt die maximale Anzahl der Einträge.value_size: Maximale Bytes für serialisierte Werte. Größere Werte werden stillschweigend gekürzt.
Octane-Listener
'listeners' => [ // Aufwärmen der Verbindung beim Start des Arbeiters (reduziert die Latenz der ersten Anfrage) 'warm' => env('RECALL_LISTEN_WARM', true), // Verarbeitung von Invalidierungen bei Tick-Ereignissen (reaktiver, wenig Überkopf) 'tick' => env('RECALL_LISTEN_TICK', false),],
Warme Verbindungen
Wenn aktiviert, stellt Recall die Redis-Invalidierungsabonnierung beim Start des Octane-Arbeiters her. Dadurch wird die Verbindungs-Latenz bei der ersten Anfrage eliminiert.
Tick-Verarbeitung
Wenn aktiviert, verarbeitet Recall Invalidierungsnachrichten auch bei Tick-Ereignissen von Octane zusätzlich zu Anfrageereignissen. Dies bietet eine reaktionsschnellere Cache-Invalidierung auf Kosten eines leichten zusätzlichen Aufwands.
Fortgeschrittene Nutzung
Manuelle Invalidierungsverarbeitung
Wenn Sie Invalidierungen manuell verarbeiten müssen (z. B. in einem langlaufenden Prozess):
use DefectiveCode\Recall\RecallManager; $manager = app(RecallManager::class);$manager->processInvalidations();
Lokalen Cache leeren
Um nur den lokalen Cache zu leeren, ohne Redis zu beeinflussen:
use DefectiveCode\Recall\RecallManager; $manager = app(RecallManager::class);$manager->flushLocalCache();
Verbindungsmanagement
use DefectiveCode\Recall\RecallManager; $manager = app(RecallManager::class); // Überprüfen, ob die Invalidierungsabonnierung verbunden istif ($manager->isConnected()) { // ...} // Manuell trennen$manager->disconnect();
Optimierung
Anfragegrenzen für Arbeiter
Laravel Octane zirkuliert Arbeiter nach einer konfigurierbaren Anzahl von Anfragen, um Speicherlecks zu verhindern. Wenn ein Arbeiter zirkuliert, wird sein lokaler Cache geleert. Wenn Sie dieses Limit erhöhen, kann der lokale Cache von Recall länger bestehen bleiben, was die Trefferquote des Caches verbessert.
In Ihrer config/octane.php:
// Standardmäßig sind 500 Anfragen vor dem Zirkulieren'max_requests' => 10000,
Höhere Werte bedeuten eine bessere Nutzung des Caches, erfordern jedoch Vertrauen, dass Ihre Anwendung keine Speicherlecks hat. Überwachen Sie den Speicherverbrauch Ihres Arbeiters bei der Anpassung dieses Wertes.
Selektives Caching mit Präfixen
Verwenden Sie cache_prefixes, um zu steuern, welche Schlüssel lokal zwischengespeichert werden. Dies ist wertvoll
wenn:
- Hochwechselnde Schlüssel: Einige Schlüssel ändern sich so häufig, dass lokales Caching wenig Nutzen bringt
- Große Werte: Reduzieren Sie den Speicherbedarf, indem Sie nur kleinere, häufig abgerufene Schlüssel zwischenspeichern
- Sensible Daten: Halten Sie bestimmte Daten nur in Redis aus Sicherheits- oder Compliance-Gründen
// config/recall.php'cache_prefixes' => [ 'users:', // Benutzerdaten lokal zwischenspeichern 'settings:', // Anwendungseinstellungen zwischenspeichern 'products:', // Produktkatalog zwischenspeichern],
Schlüssel, die diesen Präfixen nicht entsprechen, funktionieren weiterhin, aber umgehen das lokale Caching und gehen direkt zu Redis.
Speicherüberlegungen
APCu-Speicher
APCu teilt den Speicher über alle PHP-Prozesse. Konfigurieren Sie das Speicherkontingent in php.ini:
; Standardmäßig 32 MB, erhöhen für größere Cachebedürfnisseapc.shm_size = 128M
Überwachen Sie die APCu-Nutzung mit apcu_cache_info():
$info = apcu_cache_info();$memory = $info['mem_size']; // Aktuelle Speicherauslastung in Bytes
Swoole Table-Größen
Swoole-Tabellen haben eine feste Kapazität, die bei der Erstellung konfiguriert wird. Planen Sie Ihre erwartete Cache-Größe:
'local_cache' => [ // Maximale Einträge (muss eine Potenz von 2 sein) 'table_size' => 65536, // 64K Einträge // Maximale serialisierte Wertgröße in Bytes 'value_size' => 8192, // 8KB pro Wert],
Speichernutzung: table_size × (value_size + overhead). Eine Tabelle mit 65536 Einträgen und 8KB-Werten verwendet
ungefähr 512MB.
Häufige Muster
Anwendungs-Konfiguration
// Cache-Feature-Flags und Einstellungen$features = Cache::store('recall')->remember('config:features', 3600, function () { return Feature::all()->pluck('enabled', 'name')->toArray();}); // Wenn sich Einstellungen ändern, erhalten alle Arbeiter automatisch Updates
Häufig abgerufene Referenzdaten
// Produktkategorien zwischenspeichern$categories = Cache::store('recall')->remember('categories:all', 3600, function () { return Category::with('children')->whereNull('parent_id')->get();}); // Wechselkurse zwischenspeichern$rates = Cache::store('recall')->remember('rates:exchange', 300, function () { return ExchangeRate::all()->pluck('rate', 'currency')->toArray();});
Alternativen zu Cache-Tags
Recall unterstützt keine Cache-Tags, aber Sie können ähnliche Funktionalität mit Präfixen erreichen:
// Anstelle von Tags verwenden Sie konsistente PräfixeCache::store('recall')->put("blog:posts:{$id}", $post, 3600);Cache::store('recall')->put("blog:comments:{$postId}", $comments, 3600); // Alle blogbezogenen Caches durch Präfix löschen (erfordert manuelle Implementierung)// Oder auf die automatische Invalidierung vertrauen, wenn sich die Daten ändern
Einschränkungen
Redis Cluster-Modus
Recall unterstützt den Redis-Cluster-Modus nicht. Die CLIENT TRACKING-Befehlsoption REDIRECT erfordert, dass sich
die Datenverbindung und die Invalidierungsabonnierungsverbindung auf demselben Redis-Knoten befinden. In einem Cluster
werden Schlüssel basierend auf Hash-Slots über mehrere Knoten verteilt, was es unmöglich macht, Invalidierungen für
Schlüssel zu empfangen, die auf verschiedenen Knoten gespeichert sind.
Für clustered Redis-Deployments ziehen Sie in Betracht:
- Einen einzelnen Redis-Instance für zwischengespeicherte Daten zu verwenden, die vom client-seitigen Caching profitieren
- Redis Cluster für andere Daten zu verwenden, während häufig abgerufene, stabile Daten auf einer einzelnen Instanz verbleiben
Support Richtlinien
Danke, dass Sie sich für unser Open-Source-Paket entschieden haben! Bitte nehmen Sie sich einen Moment Zeit, um diese Unterstützungsrichtlinien durchzulesen. Sie helfen Ihnen, das Beste aus unserem Projekt herauszuholen.
Community-gesteuerte Unterstützung
Unser Open-Source-Projekt wird von unserer großartigen Community unterstützt. Wenn Sie Fragen haben oder Hilfe benötigen, sind StackOverflow und andere Online-Ressourcen Ihre besten Optionen.
Bugs und Priorisierung von Funktionen
Die Realität des Managements eines Open-Source-Projekts bedeutet, dass wir nicht sofort jeden gemeldeten Fehler oder jede Funktionsanfrage angehen können. Wir priorisieren Probleme in der folgenden Reihenfolge:
1. Bugs, die unsere kostenpflichtigen Produkte betreffen
Bugs, die unsere kostenpflichtigen Produkte beeinträchtigen, haben immer die höchste Priorität. In einigen Fällen behandeln wir möglicherweise nur Bugs, die uns direkt betreffen.
2. Community Pull Requests
Wenn Sie einen Bug identifiziert haben und eine Lösung haben, reichen Sie bitte einen Pull Request ein. Nach den Problemen, die unsere Produkte betreffen, geben wir diesen community-gesteuerten Fehlerbehebungen die nächsthöchste Priorität. Sobald Ihr Lösungsvorschlag geprüft und genehmigt wurde, werden wir Ihre Lösung zusammenführen und Ihre Beiträge anerkennen.
3. Finanzielle Unterstützung
Für Probleme außerhalb der genannten Kategorien können Sie sich entscheiden, deren Lösung zu finanzieren. Jedes offene Problem ist mit einem Bestellformular verknüpft, über das Sie finanziell beitragen können. Wir priorisieren diese Probleme basierend auf dem bereitgestellten Finanzierungsbetrag.
Community-Beiträge
Open Source gedeiht, wenn seine Community aktiv ist. Auch wenn Sie keine Bugs beheben, ziehen Sie in Betracht, durch Codeverbesserungen, Dokumentationsaktualisierungen, Tutorials oder durch Unterstützung anderer in Community-Kanälen einen Beitrag zu leisten. Wir ermutigen alle, als Community zusammenzuarbeiten, um die Arbeit im Bereich Open Source zu unterstützen.
Nocht einmal: DefectiveCode wird Bugs priorisieren, basierend darauf, wie sie unsere kostenpflichtigen Produkte, Community-Pull-Requests und die finanzielle Unterstützung für Probleme beeinträchtigen.
Lizenz - MIT Lizenz
Copyright © Defective Code, LLC. Alle Rechte vorbehalten
Hiermit wird jedermann, der eine Kopie dieser Software und der dazugehörigen Dokumentationsdateien (die "Software") erhält, kostenlos die Erlaubnis erteilt, die Software ohne Einschränkung zu nutzen, einschließlich, aber nicht beschränkt auf das Recht, die Software zu verwenden, zu kopieren, zu modifizieren, zusammenzuführen, zu veröffentlichen, zu vertreiben, Unterlizenzen zu erteilen und/oder Kopien der Software zu verkaufen, sowie Personen, denen die Software bereitgestellt wird, dies zu gestatten, vorbehaltlich der folgenden Bedingungen:
Die obige Urheberrechtshinweis und diese Erlaubnismitteilung sind in allen Kopien oder wesentlichen Teilen der Software enthalten.
DIE SOFTWARE WIRD "WIE BESEHEN" BEREITGESTELLT, OHNE GARANTIE IRGENDWELCHER ART, WEDER AUSDRÜCKLICH NOCH STILLSCHWEIGEND, EINSCHLIESSLICH, ABER NICHT BEGRENZT AUF DIE GARANTIEN DER MARKTFÄHIGKEIT, EIGNUNG FÜR EINEN BESTIMMTEN ZWECK UND NICHTVERLETZUNG. IN KEINEM FALL SIND DIE AUTOREN ODER URHEBERRECHTSINHABER FÜR IRGENDEINEN ANSPRUCH, SCHÄDEN ODER ANDERE HAFTUNGEN HAFTBAR, OB IN EINER KLAUSEL FÜR VERTRAG, DELIKT ODER ANDERS, DIE AUS DER SOFTWARE ODER DER NUTZUNG ODER ANDEREN GEHEIMNISSEN IN DER SOFTWARE ENTSTEHEN.