Defective Code Logo

Total Downloads Latest Stable Version Latest Stable Version

English | العربية | বাংলা | Bosanski | Deutsch | Español | Français | हिन्दी | Italiano | 日本語 | 한국어 | मराठी | Português | Русский | Kiswahili | தமிழ் | తెలుగు | Türkçe | اردو | Tiếng Việt | 中文

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

Exempel

// Konfigurera Recall som din cache-drivrutin
// config/cache.php
'stores' => [
'recall' => [
'driver' => 'recall',
],
],
 
// Använd det som vilken Laravel-cache som helst
use 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örklara
Cache::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

Användning

Grundläggande Installation

  1. Lägg till Recall cache-lagret i din config/cache.php:
'stores' => [
// ... andra butiker
 
'recall' => [
'driver' => 'recall',
],
],
  1. 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ärde
Cache::store('recall')->forget('key');

Hur Det Fungerar

  1. Första Läsning: Värdet hämtas från Redis och lagras i lokal APCu/Swoole Table cache
  2. Efterföljande Läsningar: Värdet serveras direkt från lokalt minne (sub-millisekunder)
  3. Skriv Var Som Helst: När vilken klient som helst modifierar nyckeln i Redis, skickar Redis ett ogiltigförklaringsmeddelande
  4. Automatisk Ogiltigförklaring: Recall tar emot meddelandet och tar bort nyckeln från lokal cache
  5. 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:

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:

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:

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 ansluten
if ($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:

// 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 cachebehov
apc.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 prefix
Cache::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:

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.