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