Ukladanie do vyrovnávacej pamäte
Queuety obsahuje vrstvu vyrovnávacej pamäte, ktorá obmedzuje databázové dotazy na často používaných cestách, ako sú kontroly pozastavenia frontu, počítadlá obmedzenia frekvencie, vyhľadávanie stavu pracovného postupu a operácie so zámkami. Vyrovnávacia pamäť sa inicializuje automaticky pri zavolaní Queuety::init().
Rozhranie vyrovnávacej pamäte
Všetky back-endy vyrovnávacej pamäte implementujú rozhranie Queuety\Contracts\Cache:
| Metóda | Návratová hodnota | Opis |
|---|---|---|
get( string $key ) |
mixed |
Načíta hodnotu. Ak sa nenájde alebo jej platnosť vypršala, vráti null. |
set( string $key, mixed $value, int $ttl = 0 ) |
void |
Uloží hodnotu. TTL 0 znamená, že platnosť nevyprší. |
delete( string $key ) |
void |
Odstráni hodnotu. |
has( string $key ) |
bool |
Skontroluje, či kľúč existuje a nevypršala jeho platnosť. |
add( string $key, mixed $value, int $ttl = 0 ) |
bool |
Nastaví hodnotu iba vtedy, ak kľúč ešte neexistuje (atomicky). Ak sa hodnota nastavila, vráti true. |
flush() |
void |
Odstráni všetky položky z vyrovnávacej pamäte. ApcuCache::flush() volá apcu_clear_cache(), ktoré vymaže všetky položky APCu na serveri, nielen položky aplikácie Queuety. |
Vstavané back-endy
MemoryCache (predvolená možnosť)
Queuety\Cache\MemoryCache je vyrovnávacia pamäť založená na poli, ktorá je oddelená pre každý proces. Položky sa ukladajú do poľa PHP a po ukončení procesu sa stratia. Ide o predvolený back-end, ak APCu nie je k dispozícii.
Nevyžaduje žiadne rozšírenia, dobre funguje pri nasadení s jedným workerom a každý proces workera zostáva oddelený od ostatných.
ApcuCache
Queuety\Cache\ApcuCache používa rozšírenie APCu na zdieľanie pamäte medzi všetkými procesmi PHP na tom istom serveri. Všetky kľúče automaticky dostanú predponu queuety:, aby sa predišlo kolíziám s inými aplikáciami.
Tento back-end vyžaduje rozšírenie php-apcu, zdieľa položky vyrovnávacej pamäte medzi workermi na tom istom serveri a vďaka apcu_add() zabezpečuje skutočne atomické add().
Automatické rozpoznanie
Queuety\Cache\CacheFactory automaticky vyberie najvhodnejší dostupný back-end:
Ak apcu_store() existuje a apcu_enabled() vracia true, Queuety použije ApcuCache. V opačnom prípade prejde na MemoryCache. Deje sa to v rámci Queuety::init(), takže predvolené správanie nevyžaduje ďalšiu konfiguráciu.
Čo sa ukladá do vyrovnávacej pamäte
Vrstva vyrovnávacej pamäte sa interne používa v niekoľkých subsystémoch:
| Údaje | Účel |
|---|---|
| Stav pozastavenia frontu | Zabraňuje databázovému dotazu pri každej iterácii cyklu workera |
| Počítadlá obmedzenia frekvencie | Sledujú počty vykonaní v pamäti namiesto databázy |
| Stav pracovného postupu | Obmedzuje čítania počas postupu viacstupňového pracovného postupu |
| Stav zámku | Urýchľuje kontroly existencie zámkov pri jedinečných úlohách a middleware pre mutexy |
Konfigurácia TTL
Predvolená hodnota TTL vyrovnávacej pamäte je 5 sekúnd. Platí pre stav pozastavenia frontu a počítadlá obmedzenia frekvencie; čítania stavu a stavových údajov pracovného postupu sa ukladajú na pevné 2 sekundy, ktoré táto konštanta nemení. Predvolenú hodnotu môžete zmeniť pomocou konštanty QUEUETY_CACHE_TTL vo svojom wp-config.php:
define( 'QUEUETY_CACHE_TTL', 10 ); // 10 seconds
Nižšia hodnota TTL znamená častejšie databázové dotazy, ale aktuálnejšie údaje. Vyššia hodnota TTL znižuje zaťaženie databázy, ale údaje môžu byť zastaranejšie. Pri väčšine nasadení predstavuje predvolená hodnota 5 sekúnd dobrý kompromis.
Vlastný back-end vyrovnávacej pamäte
Ak chcete použiť vlastný back-end vyrovnávacej pamäte (Redis, Memcached alebo iný), implementujte rozhranie Contracts\Cache a zavolajte Queuety::set_cache() pred Queuety::init():
use Queuety\Contracts\Cache;
use Queuety\Queuety;
class RedisCache implements Cache {
public function get( string $key ): mixed { /* ... */ }
public function set( string $key, mixed $value, int $ttl = 0 ): void { /* ... */ }
public function delete( string $key ): void { /* ... */ }
public function has( string $key ): bool { /* ... */ }
public function add( string $key, mixed $value, int $ttl = 0 ): bool { /* ... */ }
public function flush(): void { /* ... */ }
}
// Set the cache before init() so all subsystems use it.
Queuety::set_cache( new RedisCache() );
Queuety::init( $connection );
Ak zavoláte set_cache() pred init(), automatické rozpoznanie vo factory sa úplne preskočí a použije sa váš vlastný back-end.
Prístup k vyrovnávacej pamäti
Kedykoľvek načítajte aktívnu inštanciu vyrovnávacej pamäte:
$cache = Queuety::cache();
$cache->set( 'my_key', 'my_value', 60 );
$value = $cache->get( 'my_key' );
Vráti aktuálne aktívny back-end (MemoryCache, ApcuCache alebo vašu vlastnú implementáciu).