English | العربية | বাংলা | Bosanski | Deutsch | Español | Français | हिन्दी | Italiano | 日本語 | 한국어 | मराठी | Português | Русский | Kiswahili | தமிழ் | తెలుగు | Türkçe | اردو | Tiếng Việt | 中文
- Uvod
- Instalacija
- Korišćenje
- Konfiguracija
- Napredna Korišćenja
- Optimizacija
- Uobičajeni Obrasci
- Ograničenja
- Smjernice za podršku
- Licenca - MIT Licenca
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
- Automatska Invalidaicja: Redis obaveštava vašu aplikaciju kada se keširane ključevi promene, osiguravajući koherenciju keša
- Nulta Konfiguracija: Radi odmah sa razumnim podrazumevanjima
- Octane Integracija: Automatsko zagrevanje konekcije, procesuiranje invalidacija na osnovu zahteva i graciozno gašenje
- Podrška za Dvojni Vozač: APCu za sve Octane servere, Swoole Tabela za Swoole/OpenSwoole okruženja
- Selektivno Keširanje: Konfigurišite koje prefikse ključeva keširati lokalno
- Zaštita od Utrčavanja: Praćenje čekajućih zahteva sprečava keširanje zastarelih podataka tokom konkuretnih invalidacija
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 invalidiraCache::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
- PHP >= 8.4
- Laravel 11.x ili 12.x
- Laravel Octane
- Redis 6.0+ (za podršku klijent-side keširanja)
- ext-apcu ILI ext-swoole (barem jedan je potreban za lokalni keš)
Korišćenje
Osnovna Konfiguracija
- Dodajte Recall keš skladište u vaš
config/cache.php:
'stores' => [ // ... ostali skladišta 'recall' => [ 'driver' => 'recall', ],],
- 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 vrednostCache::store('recall')->forget('key');
Kako To Radi
- Prvo Čitanje: Vrednost se preuzima iz Redisa i skladišti u lokalnom APCu/Swoole Tabeli
- Naknadna Čitanja: Vrednost se poslužuje direktno iz lokalne memorije (sub-milisekundi)
- Pisanje Bilo Gde: Kada bilo koji klijent modifikuje ključ u Redis-u, Redis šalje poruku o invalidaciji
- Automatska Invalidaicja: Recall prima poruku i uklanja ključ iz lokalnog keša
- 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:
- Pokretanje Radnika: Uspostavlja Redis konekciju za invalidaciju (toplo pokretanje)
- Primljen Zahtev: Procesira sve čekajuće poruke o invalidaciji
- Zaustavljanje Radnika: Graciozno zatvara konekcije
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:
- ext-apcu instaliran i omogućen
apc.enable_cli=1u php.ini za CLI korišćenje
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:
table_size: Mora biti moć od 2 (npr., 65536, 131072). Određuje maksimalan broj unosa.value_size: Maksimalni bajti za serijalizovane vrednosti. Veće vrednosti se tiho skraćuju.
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 povezanaif ($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:
- Ključevi sa visokim promenama: Neki ključevi se menjaju toliko često da lokalno keširanje donosi malo koristi
- Velike vrednosti: Smanjite pritisak na memoriju keširanjem samo manjih, često čitanih ključeva
- Osetljivi podaci: Držite određene podatke samo u Redis-u zbog sigurnosti ili regulatornih razloga
// 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šaapc.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 prefikseCache::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:
- Korišćenje jednog Redis instance za keširane podatke koji koriste prednosti klijent-side keširanja
- Korišćenje Redis Klastera za druge podatke dok često čitane, stabilne podatke držite na samostalnoj instanci
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.