Preskočiť na obsah

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:

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():

PHP
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:

PHP
$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).