Ga naar de inhoud

Caching

Queuety bevat een cachelaag die databasequery's vermindert op veelgebruikte paden, zoals controles voor het pauzeren van wachtrijen, tellers voor snelheidslimieten, opvragingen van workflowstatus en vergrendelingsbewerkingen. De cache wordt automatisch geïnitialiseerd wanneer je Queuety::init() aanroept.

Cache-interface

Alle cachebackends implementeren Queuety\Contracts\Cache:

Methode Retourneert Beschrijving
get( string $key ) mixed Haalt een waarde op. Retourneert null als deze niet is gevonden of is verlopen.
set( string $key, mixed $value, int $ttl = 0 ) void Slaat een waarde op. Een TTL van 0 betekent dat deze niet verloopt.
delete( string $key ) void Verwijdert een waarde.
has( string $key ) bool Controleert of een sleutel bestaat en niet is verlopen.
add( string $key, mixed $value, int $ttl = 0 ) bool Stelt een waarde alleen in als de sleutel nog niet bestaat (atomair). Retourneert true als de waarde is ingesteld.
flush() void Verwijdert alle items uit de cache. ApcuCache::flush() roept apcu_clear_cache() aan, waarmee elke APCu-vermelding op de server wordt gewist, niet alleen die van Queuety.

Ingebouwde backends

MemoryCache (standaard)

Queuety\Cache\MemoryCache is een cache op basis van een array per proces. Items worden opgeslagen in een PHP-array en gaan verloren wanneer het proces wordt beëindigd. Dit is de standaardbackend wanneer APCu niet beschikbaar is.

Er zijn geen extensies voor nodig, werkt goed voor implementaties met één worker en houdt elk workerproces gescheiden van de andere.

ApcuCache

Queuety\Cache\ApcuCache gebruikt de APCu-extensie voor gedeeld geheugen tussen alle PHP-processen op dezelfde server. Aan alle sleutels wordt automatisch het voorvoegsel queuety: toegevoegd om botsingen met andere applicaties te voorkomen.

Deze backend vereist de extensie php-apcu, deelt cachevermeldingen tussen workers op dezelfde server en maakt add() echt atomair via apcu_add().

Automatische detectie

Queuety\Cache\CacheFactory kiest automatisch de beste beschikbare backend:

Als apcu_store() bestaat en apcu_enabled() true retourneert, gebruikt Queuety ApcuCache. Anders wordt teruggevallen op MemoryCache. Dit gebeurt binnen Queuety::init(), dus voor het standaardgedrag is geen extra configuratie nodig.

Wat er wordt gecachet

De cachelaag wordt intern gebruikt door verschillende subsystemen:

Gegevens Doel
Wachtrijpauzestatus Voorkomt een databasequery bij elke iteratie van de workerlus
Tellers voor snelheidslimieten Houdt uitvoeringstellingen bij in het geheugen in plaats van in de database
Workflowstatus Vermindert het aantal leesbewerkingen tijdens het doorlopen van workflows met meerdere stappen
Vergrendelingsstatus Versnelt controles op het bestaan van vergrendelingen voor unieke taken en mutex-middleware

TTL-configuratie

De standaard-TTL van de cache is 5 seconden. Deze geldt voor de wachtrijpauzestatus en tellers voor snelheidslimieten; het lezen van de workflowstatus en -toestand wordt gedurende een vaste 2 seconden gecachet, wat niet door de constante wordt gewijzigd. Overschrijf de standaardwaarde met de constante QUEUETY_CACHE_TTL in uw wp-config.php:

PHP
define( 'QUEUETY_CACHE_TTL', 10 ); // 10 seconds

Een lagere TTL betekent vaker databasequery's, maar actuelere gegevens. Een hogere TTL verlaagt de databasebelasting, maar zorgt ervoor dat gegevens langer verouderd kunnen zijn. Voor de meeste implementaties is de standaardwaarde van 5 seconden een goede balans.

Aangepaste cachebackend

Om een aangepaste cachebackend te gebruiken (Redis, Memcached of iets anders), implementeert u de interface Contracts\Cache en roept u Queuety::set_cache() aan vóór 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 );

Als set_cache() vóór init() wordt aangeroepen, wordt de automatische detectie door de factory volledig overgeslagen en wordt uw aangepaste backend gebruikt.

De cache openen

Haal op elk moment de actieve cache-instantie op:

PHP
$cache = Queuety::cache();

$cache->set( 'my_key', 'my_value', 60 );
$value = $cache->get( 'my_key' );

Dit retourneert de backend die op dat moment actief is (MemoryCache, ApcuCache of uw eigen implementatie).