English | العربية | বাংলা | Bosanski | Deutsch | Español | Français | हिन्दी | Italiano | 日本語 | 한국어 | मराठी | Português | Русский | Kiswahili | தமிழ் | తెలుగు | Türkçe | اردو | Tiếng Việt | 中文
- Introduktion
- Installation
- Användning
- Konfiguration
- Avancerad Användning
- Optimering
- Vanliga Mönster
- Begränsningar
- Stödriktlinjer
- Licens - MIT Licens
Introduktion
Recall är ett högpresterande Redis-klientbaserat cachingpaket för Laravel. Det utnyttjar Redis 6:s klientbaserade caching funktion med automatisk ogiltigförklaring för att dramatiskt minska Redis ronder och latens. Byggt specifikt för Laravel Octane-miljöer, använder det APCu eller Swoole Table som ett lokalt cachelager som förblir synkroniserat med Redis genom ogiltigförklaringsmeddelanden.
När du hämtar ett värde från Redis, lagrar Recall det lokalt. När det värdet ändras i Redis (från vilken klient som helst), meddelar Redis automatiskt Recall att ogiltigförklara den lokala kopian. Detta ger dig hastigheten av minnescache med konsistensgarantier från Redis.
Nyckelfunktioner
- Automatisk Ogiltigförklaring: Redis meddelar din applikation när cachade nycklar ändras, vilket säkerställer cachekohesion
- Ingen Konfiguration: Fungerar direkt ur lådan med rimliga standardinställningar
- Octane integration: Automatisk anslutningsuppvärmning, begärningsbaserad ogiltigförklaring och smidig nedstängning
- Dubbel Drivarsupport: APCu för alla Octane-servrar, Swoole Table för Swoole/OpenSwoole-miljöer
- Selektiv Caching: Konfigurera vilka nyckelförprefix att cacha lokalt
- Skydd mot Tävlingstillstånd: Trackingen av pågående begärningar förhindrar caching av gammal data under samtidiga ogiltigförklaringar
Exempel
// Konfigurera Recall som din cache-drivrutin// config/cache.php'stores' => [ 'recall' => [ 'driver' => 'recall', ],], // Använd det som vilken Laravel-cache som helstuse Illuminate\Support\Facades\Cache; // Första anropet: hämtar från Redis, lagrar lokalt$user = Cache::store('recall')->get('user:1'); // Efterföljande anrop: serveras från lokal APCu/Swoole Table (mikrosekunder)$user = Cache::store('recall')->get('user:1'); // När user:1 uppdateras någonstans, meddelar Redis Recall att ogiltigförklaraCache::store('recall')->put('user:1', $newUserData, 3600);// Lokal cache ogiltigförklaras automatiskt på alla arbetare
Installation
Installera paketet via Composer:
composer require defectivecode/laravel-recall
Krav
- PHP >= 8.4
- Laravel 11.x eller 12.x
- Laravel Octane
- Redis 6.0+ (för stöd för klientbaserad caching)
- ext-apcu ELLER ext-swoole (minst en krävs för lokal cache)
Användning
Grundläggande Installation
- Lägg till Recall cache-lagret i din
config/cache.php:
'stores' => [ // ... andra butiker 'recall' => [ 'driver' => 'recall', ],],
- Använd cache-lagret i din applikation:
use Illuminate\Support\Facades\Cache; // Lagra ett värde (skriver till Redis)Cache::store('recall')->put('key', 'value', 3600); // Hämta ett värde (första anropet träffar Redis, efterföljande anrop använder lokal cache)$value = Cache::store('recall')->get('key'); // Ta bort ett värdeCache::store('recall')->forget('key');
Hur Det Fungerar
- Första Läsning: Värdet hämtas från Redis och lagras i lokal APCu/Swoole Table cache
- Efterföljande Läsningar: Värdet serveras direkt från lokalt minne (sub-millisekunder)
- Skriv Var Som Helst: När vilken klient som helst modifierar nyckeln i Redis, skickar Redis ett ogiltigförklaringsmeddelande
- Automatisk Ogiltigförklaring: Recall tar emot meddelandet och tar bort nyckeln från lokal cache
- Nästa Läsning: Nytt värde hämtas från Redis och cachas lokalt igen
Detta mönster är särskilt kraftfullt i Laravel Octane-miljöer där arbetare består mellan begärningar, vilket gör att den lokala cachen kan byggas upp och servera många begärningar från minnet.
Octane Integration
Recall integreras automatiskt med Laravel Octane när det är tillgängligt:
- Arbetare Startar: Etablerar Redis ogiltigförklaringsanslutning ( varm start)
- Begäran Mottagen: Bearbetar eventuella utestående ogiltigförklaringsmeddelanden
- Arbetare Stoppar: Stänger anslutningar smidigt
Ingen ytterligare konfiguration krävs. Integrationen är automatisk när Octane är installerat.
Konfiguration
Publicera konfigurationsfilen:
php artisan vendor:publish --tag=recall-config
Detta skapar config/recall.php med följande alternativ:
Aktivera/Deaktivera
'enabled' => env('RECALL_ENABLED', true),
När ogiltigförklarad passerar Recall genom direkt till Redis utan att använda det lokala cachelagret. Användbart för felsökning eller gradvis utrullning.
Redis Lagring
'redis_store' => env('RECALL_REDIS_STORE', 'redis'),
Laravel cache-lagret som ska användas för Redis-operationer. Detta bör referera till ett Redis-lager som är konfigurerat i din
config/cache.php.
Cache Prefixer
'cache_prefixes' => [],
Cache endast nycklar som matchar dessa prefix lokalt. Lämna tomt för att cacha alla nycklar.
// Cache endast användar- och inställningsnycklar lokalt'cache_prefixes' => ['users:', 'settings:', 'config:'],
Detta är användbart när du har höghastighetsnycklar som ändras ofta och som inte bör cachas lokalt.
Lokal Cache Konfiguration
'local_cache' => [ // Drivrutin: "apcu" eller "swoole" 'driver' => env('RECALL_LOCAL_DRIVER', 'apcu'), // Prefix för lokala cache-nycklar 'key_prefix' => env('RECALL_LOCAL_PREFIX', 'recall:'), // Standard TTL i sekunder (säkerhetsnät om ogiltigförklaring missas) 'default_ttl' => (int) env('RECALL_LOCAL_TTL', 3600), // Swoole Table-storlek (kraft av 2, endast för swoole-drivrutin) 'table_size' => (int) env('RECALL_SWOOLE_TABLE_SIZE', 65536), // Max byte per värde i Swoole Table (endast för swoole-drivrutin) 'value_size' => (int) env('RECALL_SWOOLE_VALUE_SIZE', 8192),],
APCu Drivrutin (Standard)
APCu-drivrutinen fungerar med alla PHP-miljöer och Octane-servrar (Swoole, RoadRunner, FrankenPHP). Den lagrar cacheade värden i delat minne som är tillgängligt för alla PHP-processer.
Krav:
- ext-apcu installerad och aktiverad
apc.enable_cli=1i php.ini för CLI-användning
Swoole Table Drivrutin
Swoole Table-drivrutinen använder Swooles delade minnestabeller och ger konsekvent åtkomst över koroutiner inom samma arbetare. Bäst för Swoole/OpenSwoole-miljöer.
Konfigurationstips:
table_size: Måste vara en kraft av 2 (t.ex., 65536, 131072). Bestämmer max antal poster.value_size: Maximala byte för serialiserade värden. Större värden trunkeras tyst.
Octane Lyssnare
'listeners' => [ // Värma anslutning vid arbetars start (minskar latensen för första begäran) 'warm' => env('RECALL_LISTEN_WARM', true), // Bearbeta ogiltigförklaringar vid tick-händelser (mer responsiv, liten overhead) 'tick' => env('RECALL_LISTEN_TICK', false),],
Värma Anslutningar
När det är aktiverat, etablerar Recall Redis ogiltigförklaringsprenumerationen när Octane-arbetaren startar. Detta eliminerar anslutningslatens på den första begärningen.
Tick-Bearbetning
När det är aktiverat, bearbetar Recall ogiltigförklaringsmeddelanden vid Octane-tick-händelser utöver begärningshändelser. Detta ger mer responsiv cacheogiltigförklaring till kostnaden av liten extra overhead.
Avancerad Användning
Manuell Ogiltigförklaringsbearbetning
Om du behöver bearbeta ogiltigförklaringar manuellt (t.ex. i en långvarig process):
use DefectiveCode\Recall\RecallManager; $manager = app(RecallManager::class);$manager->processInvalidations();
Rensa Lokal Cache
För att endast rensa den lokala cachen utan att påverka Redis:
use DefectiveCode\Recall\RecallManager; $manager = app(RecallManager::class);$manager->flushLocalCache();
Anslutningshantering
use DefectiveCode\Recall\RecallManager; $manager = app(RecallManager::class); // Kontrollera om ogiltigförklaringsprenumerationen är anslutenif ($manager->isConnected()) { // ...} // Koppla från manuellt$manager->disconnect();
Optimering
Arbetare Begärningsgränser
Laravel Octane cyklar arbetare efter ett konfigurerbart antal begärningar för att förhindra minnesläckor. När en arbetare cyklar, rensas dess lokala cache. Att öka denna gräns gör att Recall:s lokala cache kan bestå längre, vilket förbättrar träfffrekvenser för cache.
I din config/octane.php:
// Standard är 500 begärningar innan cykling'max_requests' => 10000,
Högre värden betyder bättre cacheutnyttjande men kräver förtroende för att din applikation inte har minnesläckor. Övervaka din arbetars minnesanvändning när du justerar detta värde.
Selektiv Caching med Prefixer
Använd cache_prefixes för att kontrollera vilka nycklar som cachas lokalt. Detta är värdefullt när:
- Högomsättning nycklar: Vissa nycklar ändras så ofta att lokal caching ger liten nytta
- Stora värden: Minska minnestrycket genom att endast cacha mindre, ofta lästa nycklar
- Känslig data: Behåll viss data endast i Redis av säkerhet eller regelefterlevnadsskäl
// config/recall.php'cache_prefixes' => [ 'users:', // Cache användardata lokalt 'settings:', // Cache applikationsinställningar 'products:', // Cache produktkatalog],
Nycklar som inte matchar dessa prefix kommer fortfarande att fungera men kringgå lokal caching, och går direkt till Redis.
Minneshänsyn
APCu Minne
APCu delar minnet över alla PHP-processer. Konfigurera minnesgränsen i php.ini:
; Standard är 32MB, öka för större cachebehovapc.shm_size = 128M
Övervaka APCu-användningen med apcu_cache_info():
$info = apcu_cache_info();$memory = $info['mem_size']; // Aktuell minnesanvändning i byte
Swoole Table Storlek
Swoole-Tabeller har fast kapacitet som konfigureras vid skapandet. Planera för din förväntade cache-storlek:
'local_cache' => [ // Maximala poster (måste vara kraft av 2) 'table_size' => 65536, // 64K poster // Maximala storleken för serialiserade värden i byte 'value_size' => 8192, // 8KB per värde],
Minnesanvändning: table_size × (value_size + overhead). En tabell med 65536 poster och 8KB värden använder ungefär
512MB.
Vanliga Mönster
Applikationskonfiguration
// Cache funktionsflaggor och inställningar$features = Cache::store('recall')->remember('config:features', 3600, function () { return Feature::all()->pluck('enabled', 'name')->toArray();}); // När inställningar ändras, tar alla arbetare automatiskt emot uppdateringar
Frekvent Åtkomlig Referensdata
// Cache produktkategorier$categories = Cache::store('recall')->remember('categories:all', 3600, function () { return Category::with('children')->whereNull('parent_id')->get();}); // Cache valutakurser$rates = Cache::store('recall')->remember('rates:exchange', 300, function () { return ExchangeRate::all()->pluck('rate', 'currency')->toArray();});
Cache Taggar Alternativ
Recall stödjer inte cache-taggar, men du kan uppnå liknande funktionalitet med prefix:
// Istället för taggar, använd konsekventa prefixCache::store('recall')->put("blog:posts:{$id}", $post, 3600);Cache::store('recall')->put("blog:comments:{$postId}", $comments, 3600); // Rensa all bloggrelaterad cache genom prefix (kräver manuell implementering)// Eller förlita dig på automatisk ogiltigförklaring när data ändras
Begränsningar
Redis Klusterläge
Recall stöder inte Redis klusterläge. CLIENT TRACKING kommandots REDIRECT alternativ kräver att både datakapacitet
och ogiltigförklaringsprenumerationsanslutning är på samma Redis-nod. I ett kluster, distribueras nycklar över flera noder baserat på hash-slotter, vilket gör det omöjligt att ta emot ogiltigförklaringar för nycklar som finns på olika noder.
För kluster-deployment av Redis, överväg:
- Att använda en enda Redis-instans för cachad data som drar nytta av klientbaserat caching
- Att använda Redis-Cluster för annan data medan du behåller ofta lästa, stabila data på en fristående instans
Stödriktlinjer
Tack för att du valde vårt öppna källkodsprojekt! Vänligen ta ett ögonblick för att titta på dessa stödriktlinjer. De kommer att hjälpa dig att få ut det mesta av vårt projekt.
Gemenskapsdriven Stöd
Vårt öppna källkodsprojekt drivs av vår fantastiska gemenskap. Om du har frågor eller behöver hjälp, är StackOverflow och andra online-resurser dina bästa alternativ.
Buggar och Prioritering av Funktioner
Verkligheten av att hantera ett öppet källkodsprojekt betyder att vi inte kan ta itu med varje rapporterad bugg eller funktionsönskemål omedelbart. Vi prioriterar ärenden i följande ordning:
1. Buggar som Påverkar Våra Betalda Produkter
Buggar som påverkar våra betalda produkter kommer alltid att vara vår högsta prioritet. I vissa fall kan vi endast ta itu med buggar som påverkar oss direkt.
2. Gemenskaps Pull Begärningar
Om du har identifierat en bugg och har en lösning, vänligen skicka in en pull-begäran. Efter ärenden som påverkar våra produkter ger vi näst högsta prioritet till dessa gemenskapsdrivna lösningar. När de har granskats och godkänts, kommer vi att sammanfoga din lösning och kreditera ditt bidrag.
3. Ekonomiskt Stöd
För frågor utanför de nämnda kategorierna kan du välja att finansiera deras lösning. Varje öppen fråga är kopplad till ett beställningsformulär där du kan bidra ekonomiskt. Vi prioriterar dessa frågor baserat på det belopp som anges.
Gemenskapsbidrag
Öppen källkod blomstrar när dess gemenskap är aktiv. Även om du inte åtgärdar buggar, överväg att bidra genom kodförbättringar, dokumentationsuppdateringar, handledningar eller genom att hjälpa andra i gemenskapskanaler. Vi uppmuntrar starkt alla, som en gemenskap, att hjälpa till att stödja arbetet med öppen källkod.
För att upprepa, kommer DefectiveCode att prioritera buggar baserat på hur de påverkar våra betalda produkter, gemenskaps pull-begärningar, och det ekonomiska stöd som erhållits för problem.
Licens - MIT Licens
Copyright © Defective Code, LLC. Alla rättigheter förbehålles
Härmed beviljas tillstånd, kostnadsfritt, till varje person som erhåller en kopia av denna programvara och tillhörande dokumentationsfiler (”Programvaran”), att hantera Programvaran utan begränsningar, inklusive utan begränsning rätten att använda, kopiera, modifiera, sammanfoga, publicera, distribuera, underlicensiera och/eller sälja kopior av Programvaran, och att tillåta personer som Programvaran tillhandahålls till att göra det, med förbehåll för följande villkor:
Den ovanstående copyrightnotisen och denna tillståndsnotis ska inkluderas i alla kopior eller väsentliga delar av Programvaran.
PROGRAMVARAN TILLHANDAHÅLLS "I BEFINTLIGT SKICK", UTAN NÅGON SOM HELST GARANTI, VARE SIG UTTRYCKLIG ELLER UNDERFÖRSTÅDD, INKLUSIVE MEN INTE BEGRÄNSAT TILL GARANTIER FÖR SÄLJBARHET, LÄMPLIGHET FÖR ETT BESTÄMT ÄNDAMÅL OCH INTE KRÄNKNING. UNDER INGA OMSTÄNIGHETER SKA FÖRFATTARNA ELLER COPYRIGHTINNEHAVARNA ANSVARA FÖR NÅGON FORDRAN, SKADOR ELLER ANNAN ANSVARSSKYLDIGHET, VARE SIG I EN RÄTTSLIG ÅTGÄRD, SKADESTÅND ELLER ANNAT, SOM UPPSTÅR FRÅN, GENOM ELLER I SAMBAND MED PROGRAMVARAN ELLER ANVÄNDNINGEN ELLER ANDRA AFFÄRER I PROGRAMVARAN.