Kešovanie
Pred databázou sú dve vrstvy:
- Pamäť v rámci requestu — vždy zapnutá. Žije počas jedného requestu alebo jedného jobu vo fronte: v kontajneri je naviazaná ako scoped a zahodí sa aj pri štarte jobu či pri prijatí requestu v Octane, takže dlhobežiaci worker nikdy neposiela hodnotu, ktorú medzitým zmenil iný proces.
- Trvalá cache — options.cache.enabled, predvolene zapnutá — v ľubovoľnom cache úložisku Illuminate. Zápisy aj mazania ju po commite aktualizujú, takže každý proces uvidí zmenu od svojho ďalšieho requestu či jobu.
Čítanie skontroluje pamäť requestu, potom trvalé úložisko a nakoniec databázu (s návratom na default()). set() zapíše novú surovú hodnotu do oboch vrstiev, forget() namiesto nej zapíše výslovný záznam „nič nie je uložené“ a import zapíše každú importovanú surovú hodnotu — nič iné invalidovať netreba.
Surové hodnoty, nikdy casty
Obe vrstvy držia surový uložený reťazec, nikdy hodnotu po caste: šifrované nastavenie zostane v cache šifrovým textom a serializujú sa len skalárne hodnoty, takže ochrana unserialize v Laraveli (cache.serializable_classes) z Collection či Carbon v cache neurobí __PHP_Incomplete_Class. Každé čítanie surovú hodnotu pretypuje.
OPTIONS_CACHE_ENABLED=true
OPTIONS_CACHE_STORE=redis # null = the app’s default store
OPTIONS_CACHE_TTL=600 # seconds; null caches forever
OPTIONS_CACHE_PREFIX=options
OPTIONS_CACHE_TAG=optionsTransakcie a súbežné čítania
Pamäť requestu prevezme novú hodnotu hneď, takže request, ktorý zapisuje, číta svoj vlastný zápis — aj v transakcii, rovnako ako jeho databázové spojenie. Záznam v trvalej cache sa hneď zahodí a znova sa naplní až po commite zápisu: mimo transakcie okamžite, v transakcii po commite tej najvonkajšej, po rollbacku nikdy. Žiadny iný proces tak nedostane hodnotu, ktorú databáza nikdy nepotvrdila.
Čítanie, ktoré v cache nič nenájde, naplní trvalý záznam cez add() — len ak v cache ešte nič nie je. Zápis, forget alebo import, ktorý medzi takým čítaním a naplnením prebehol, už uložil novší záznam, ktorý staršie čítanie neprepíše, takže TTL nikdy nezakonzervuje zastaranú hodnotu.
Vyprázdnenie
Options::flushCache(); // clears the in-request memo and the persistent entriesphp artisan options:clear-cacheflushCache() aj options:clear-cache fungujú na každom úložisku. Každý kľúč v cache obsahuje token generácie a vyprázdnenie prejde na novú, takže starý záznam sa už neprečíta — ani v iných procesoch, od ich ďalšieho requestu či jobu. Úložisko s tagmi (Redis, Memcached) staré záznamy navyše hneď zmaže; na ostatných (file, database) vypršia podľa cache.ttl a pri TTL null zostanú, kým ich úložisko samo neodstráni.
Kľúče v cache
Trvalé kľúče majú tvar {prefix}:{generation}:options:{key}:{scope}, kde scope je global alebo md5 z morph triedy vlastníka s predponou jej dĺžky a z kľúča vlastníka — dvaja vlastníci tak nikdy nezdieľajú kľúč. Samotná generácia je uložená pod {prefix}:generation.
Ak kľúč generácie chýba — úložisko ho vyhodilo alebo prebehol cache:clear —, vytvorí sa cez add() nový náhodný token a znova sa prečíta, takže requesty, ktoré ho v tej istej chvíli nenájdu, prijmú jednu generáciu; stará generácia sa nikdy znova nepoužije. Zápisy idú pod generáciu, ktorú úložisko práve drží, a ak sa iný proces od začiatku requestu posunul ďalej, aj pod generáciu zapamätanú v requeste.
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.