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 | 中文

Uvod

Recall je visokoperformantni Redis klijent-side caching paket za Laravel. Koristi Redis 6 klijent-side caching funkcionalnost sa automatskom invalidaicjom kako bi drastično smanjio Redis krugove i latenciju. Izgrađen posebno za Laravel Octane okruženja, koristi APCu ili Swoole tabelu kao lokalni sloj keša koji ostaje sinhronizovan sa Redis-om putem poruka o invalidaciji.

Kada preuzimate vrednost iz Redisa, Recall je skladišti lokalno. Kada se ta vrednost promeni u Redis-u (iz bilo kojeg klijenta), Redis automatski obaveštava Recall da invalidira lokalnu kopiju. Ovo vam daje brzinu keširanja u memoriji sa konzistentnim garancijama Redisa.

Ključne Funkcije

Primer

// Konfigurišite recall kao vaš vozač keša
// config/cache.php
'stores' => [
'recall' => [
'driver' => 'recall',
],
],
 
// Koristite ga kao bilo koji Laravel keš
use Illuminate\Support\Facades\Cache;
 
// Prvi poziv: preuzima iz Redisa, skladišti lokalno
$user = Cache::store('recall')->get('user:1');
 
// Naknadni pozivi: posluženo iz lokalnog APCu/Swoole Tabele (mikrosekunde)
$user = Cache::store('recall')->get('user:1');
 
// Kada se user:1 ažurira bilo gde, Redis obaveštava Recall da invalidira
Cache::store('recall')->put('user:1', $newUserData, 3600);
// Lokalni keš se automatski invalidira na svim radnicima

Instalacija

Instalirajte paket putem Composera:

composer require defectivecode/laravel-recall

Zahtevi

Korišćenje

Osnovna Konfiguracija

  1. Dodajte Recall keš skladište u vaš config/cache.php:
'stores' => [
// ... ostali skladišta
 
'recall' => [
'driver' => 'recall',
],
],
  1. Koristite skladište keša u vašoj aplikaciji:
use Illuminate\Support\Facades\Cache;
 
// Skladišti vrednost (piše u Redis)
Cache::store('recall')->put('key', 'value', 3600);
 
// Preuzmi vrednost (prvi poziv pogađa Redis, naknadni pozivi koriste lokalni keš)
$value = Cache::store('recall')->get('key');
 
// Obriši vrednost
Cache::store('recall')->forget('key');

Kako To Radi

  1. Prvo Čitanje: Vrednost se preuzima iz Redisa i skladišti u lokalnom APCu/Swoole Tabeli
  2. Naknadna Čitanja: Vrednost se poslužuje direktno iz lokalne memorije (sub-milisekundi)
  3. Pisanje Bilo Gde: Kada bilo koji klijent modifikuje ključ u Redis-u, Redis šalje poruku o invalidaciji
  4. Automatska Invalidaicja: Recall prima poruku i uklanja ključ iz lokalnog keša
  5. Sledeće Čitanje: Sveža vrednost se ponovo preuzima iz Redisa i kešira lokalno

Ovaj obrazac je posebno moćan u Laravel Octane okruženjima gde radnici opstaju između zahteva, omogućavajući lokalnom kešu da se gradi i poslužuje mnoge zahteve iz memorije.

Octane Integracija

Recall se automatski integriše sa Laravel Octane kada je dostupan:

Nema dodatne konfiguracije koja je potrebna. Integracija je automatska kada je Octane instaliran.

Konfiguracija

Objavite konfiguracioni fajl:

php artisan vendor:publish --tag=recall-config

Ovo stvara config/recall.php sa sledećim opcijama:

Aktiviraj/Deaktiviraj

'enabled' => env('RECALL_ENABLED', true),

Kada je deaktivirano, Recall direktno prolazi kroz Redis bez korišćenja lokalnog keš sloja. Korisno za debagovanje ili postepenu upotrebu.

Redis Skladište

'redis_store' => env('RECALL_REDIS_STORE', 'redis'),

Laravel keš skladište koje treba koristiti za Redis operacije. Ovo bi trebalo da se odnosi na Redis skladište konfigurisano u vašem config/cache.php.

Prefiksi Keša

'cache_prefixes' => [],

Samo keširajte ključeve koji odgovaraju ovim prefiksima lokalno. Ostavite prazno da keširate sve ključeve.

// Samo keširajte korisničke i postavke ključeve lokalno
'cache_prefixes' => ['users:', 'settings:', 'config:'],

Ovo je korisno kada imate ključeve velikog obima koji se često menjaju i ne trebaju lokalno keširanje.

Konfiguracija Lokalnog Keša

'local_cache' => [
// Vozač: "apcu" ili "swoole"
'driver' => env('RECALL_LOCAL_DRIVER', 'apcu'),
 
// Prefiks za lokalne keš ključeve
'key_prefix' => env('RECALL_LOCAL_PREFIX', 'recall:'),
 
// Podrazumevani TTL u sekundama (sigurnosna mreža ako se invalidacija propusti)
'default_ttl' => (int) env('RECALL_LOCAL_TTL', 3600),
 
// Velikost Swoole Tabele (moć od 2, samo za swoole vozača)
'table_size' => (int) env('RECALL_SWOOLE_TABLE_SIZE', 65536),
 
// Maksimalni bajti po vrednosti u Swoole Tabeli (samo za swoole vozača)
'value_size' => (int) env('RECALL_SWOOLE_VALUE_SIZE', 8192),
],

APCu Vozač (Podrazumevano)

APCu vozač radi sa svim PHP okruženjima i Octane serverima (Swoole, RoadRunner, FrankenPHP). Skladišti keširane vrednosti u deljenoj memoriji dostupnoj svim PHP procesima.

Zahtevi:

Swoole Tabela Vozač

Swoole Tabela vozač koristi Swoole-ove deljenje memorijske tabele, pružajući konzistentan pristup preko korutina unutar istog radnika. Najbolje za Swoole/OpenSwoole okruženja.

Saveti za konfiguraciju:

Octane Slušaoci

'listeners' => [
// Topla konekcija na početku radnika (smanjuje latenciju prvog zahteva)
'warm' => env('RECALL_LISTEN_WARM', true),
 
// Procesuiranje invalidacija na tick događajima (odgovornije, malo preopterećenje)
'tick' => env('RECALL_LISTEN_TICK', false),
],

Toplo Konektovanje

Kada je omogućeno, Recall uspostavlja Redis invalidacijski pretplatnički kada Octane radnik počne. Ovo eliminiše latenciju konekcije na prvom zahtevu.

Tick Procesuiranje

Kada je omogućeno, Recall obrađuje poruke o invalidaciji na Octane tick događajima pored zahteva. Ovo pruža odgovornije keširanje invalidacija uz malo dodatnog preopterećenja.

Napredna Korišćenja

Ručno Procesuiranje Invalidacija

Ako vam je potrebno da ručno procesuirate invalidacije (npr., u dugotrajnom procesu):

use DefectiveCode\Recall\RecallManager;
 
$manager = app(RecallManager::class);
$manager->processInvalidations();

Pražnjenje Lokalnog Keša

Da biste očistili samo lokalni keš bez uticaja na Redis:

use DefectiveCode\Recall\RecallManager;
 
$manager = app(RecallManager::class);
$manager->flushLocalCache();

Upravljanje Konekcijama

use DefectiveCode\Recall\RecallManager;
 
$manager = app(RecallManager::class);
 
// Proverite da li je pretplata na invalidaciju povezana
if ($manager->isConnected()) {
// ...
}
 
// Ručno se disconectujte
$manager->disconnect();

Optimizacija

Ograničenja Zahteva Radnika

Laravel Octane menja radnike nakon konfigurisanog broja zahteva kako bi sprečio curenje memorije. Kada se radnik cikli, njegov lokalni keš se čisti. Povećanje ovog ograničenja omogućava Recall-ovom lokalnom kešu da opstane duže, poboljšavajući stope pristupa kešu.

U vašem config/octane.php:

// Podrazumevano je 500 zahteva pre cikliranja
'max_requests' => 10000,

Više vrednosti znače bolju upotrebu keša, ali zahtevaju poverenje da vaša aplikacija nema curenje memorije. Pratite korišćenje memorije vaših radnika kada podešavate ovu vrednost.

Selektivno Keširanje sa Prefiksima

Koristite cache_prefixes da kontrolišete koji se ključevi keširaju lokalno. Ovo je dragoceno kada:

// config/recall.php
'cache_prefixes' => [
'users:', // Keširajte korisničke podatke lokalno
'settings:', // Keširajte postavke aplikacije
'products:', // Keširajte proizvodni katalog
],

Ključevi koji ne odgovaraju ovim prefiksima i dalje će raditi, ali će zaobići lokalno keširanje, idući direktno ka Redis-u.

Razmatranja Memorije

APCu Memorija

APCu deli memoriju među svim PHP procesima. Konfigurišite memorijski limit u php.ini:

; Podrazumevano je 32MB, povećajte za veće potrebe keša
apc.shm_size = 128M

Pratite korišćenje APCu sa apcu_cache_info():

$info = apcu_cache_info();
$memory = $info['mem_size']; // Trenutna upotreba memorije u bajtovima

Swoole Tabela Veličina

Swoole Tabele imaju fiksni kapacitet konfigurisan prilikom kreiranja. Planirajte za vašu očekivanu veličinu keša:

'local_cache' => [
// Maksimalni unosi (mora biti moć od 2)
'table_size' => 65536, // 64K unosa
 
// Maksimalna serijalizovana veličina vrednosti u bajtovima
'value_size' => 8192, // 8KB po vrednosti
],

Korišćenje memorije: table_size × (value_size + preopterećenje). Tabela sa 65536 unosa i 8KB vrednostima koristi približno 512MB.

Uobičajeni Obrasci

Konfiguracija Aplikacije

// Keširajte funkcionalne zastavice i postavke
$features = Cache::store('recall')->remember('config:features', 3600, function () {
return Feature::all()->pluck('enabled', 'name')->toArray();
});
 
// Kada se postavke promene, svi radnici automatski primaju ažuriranja

Često Pristupani Referentni Podaci

// Keširajte kategorije proizvoda
$categories = Cache::store('recall')->remember('categories:all', 3600, function () {
return Category::with('children')->whereNull('parent_id')->get();
});
 
// Keširajte devizne kurseve
$rates = Cache::store('recall')->remember('rates:exchange', 300, function () {
return ExchangeRate::all()->pluck('rate', 'currency')->toArray();
});

Alternativa Keš Tagovima

Recall ne podržava keš tagove, ali možete postići sličnu funkcionalnost sa prefiksima:

// Umesto tagova, koristite dosledne prefikse
Cache::store('recall')->put("blog:posts:{$id}", $post, 3600);
Cache::store('recall')->put("blog:comments:{$postId}", $comments, 3600);
 
// Očistite sav keš povezan sa blogom putem prefiksa (zahteva ručnu implementaciju)
// Ili se oslonite na automatsku invalidaciju kada se podaci promene

Ograničenja

Redis Klaster Mod

Recall ne podržava Redis Klaster mod. CLIENT TRACKING komanda sa REDIRECT opcijom zahteva da i podaci konekcija i konekcija pretplatnika za invalidaciju budu na istom Redis čvoru. U klasteru, ključevi su distribuirani među više čvorova na osnovu hash slotova, što otežava primanje invalidacija za ključeve smeštene na različitim čvorovima.

Za klasterske Redis implementacije, razmotrite:

Smjernice za podršku

Hvala što ste odabrali naš paket otvorenog koda! Molimo vas da odvojite trenutak da pregledate ove smjernice za podršku. Pomoći će vam da izvučete maksimum iz našeg projekta.

Podrška vođena zajednicom

Naš projekat otvorenog koda pokreće naša sjajna zajednica. Ako imate pitanja ili trebate pomoć, StackOverflow i ostali online resursi su najbolji izbor.

Greške i prioritizacija funkcionalnosti

Stvarnost upravljanja projektom otvorenog koda je da ne možemo odmah riješiti svaku prijavljenu grešku ili zahtjev za funkcionalnošću. Prioritizujemo probleme u sledećem redu:

1. Greške koje utiču na naše plaćene proizvode

Greške koje utiču na naše plaćene proizvode uvijek će biti naš najveći prioritet. U nekim slučajevima, možda ćemo se fokusirati samo na greške koje direktno utiču na nas.

2. Pull zahtjevi zajednice

Ako ste identificirali grešku i imate rešenje, molimo pošaljite pull zahtjev. Nakon problema koji utiču na naše proizvode, sledeći najveći prioritet daju se ovim ispravkama koje pokreće zajednica. Kada se pregledaju i odobre, spojit ćemo vaše rešenje i priznati vaš doprinos.

3. Finansijska podrška

Za probleme izvan pomenutih kategorija, možete se odlučiti da finansijski podržite njihovo rješavanje. Svaki otvoreni problem je povezan s narudžbenicom na kojoj možete financijski doprinijeti. Prioritizujemo ove probleme na osnovu iznosa finansiranja koji je pružen.

Doprinosi zajednice

Otvoreni kod napreduje kada je njegova zajednica aktivna. Čak i ako ne ispravljate greške, razmislite o doprinosu kroz poboljšanja koda, ažuriranja dokumentacije, tutorijale ili pomažući drugima u zajedničkim kanalima. Veoma ohrabrujemo sve, kao zajednicu, da pomognu u podršci radu otvorenog koda.

Ponovo naglašavamo, DefectiveCode će prioritetizovati greške na osnovu njihovog uticaja na naše plaćene proizvode, pull zahtjeve zajednice i finansijsku podršku primljenu za probleme.

Licenca - MIT Licenca

Autorska prava © Defective Code, LLC. Sva prava zadržana

Ovim se dozvoljava, bez naplate, svakoj osobi koja dobije kopiju ovog softvera i pripadajućeg dokumentacionog materijala (u daljem tekstu "Softver"), da se bavi Softverom bez ograničenja, uključujući, ali ne ograničavajući se na prava da koristi, kopira, modifikuje, spaja, objavljuje, distribuira, sublicencira i/ili prodaje kopije Softvera, te da omogući osobama kojima je Softver dostavljen da učine tako, pod sledećim uslovima:

Gore navedena autorska prava i ova dozvola moraju biti uključeni u sve kopije ili bitne delove Softvera.

SOFTVER SE DOSTAVLJA "KAKAV JESTE", BEZ GARANCIJE BILO KAKVE VRSTE, IZRIČITE ILI IMPLICIRANE, UKLJUČUJUĆI, ALI NE OGRANIČAVAJUĆI SE NA GARANCIJE PRODAJE, PRIKLADNOSTI ZA ODREĐENU NAMENU I NEPOŠTOVANJE PRAVA. U NIKAKVOM SLUČAJU AUTORI ILI NOSIOCI AUTORSKIH PRAVA NEĆE BITI ODGOVORNI ZA BILO KAKVE POTRAŽIVANJA, ŠTETE ILI DRUGE OBAVEZE, BEZ OBZIRA NA TO DA LI JE U PITANJU TUŽBA ZBOG UGOVORA, DELIKTA ILI DRUGIH RAZLOGA, PROIZAŠLE IZ, VAN ILI U VEZI SA SOFTVEROM ILI KORIŠĆENJEM ILI DRUGIM TRANSAKCIJAMA U VEZI SA SOFTVEROM.