Gå til indhold

Caching

Queuety indeholder et cachelag, der reducerer databaseforespørgsler på ofte benyttede kodeveje, f.eks. kontroller af køpauser, tællere for hastighedsbegrænsning, opslag af workflowtilstand og låsehandlinger. Cachen initialiseres automatisk, når du kalder Queuety::init().

Cachegrænseflade

Alle cachebackends implementerer Queuety\Contracts\Cache:

Metode Returnerer Beskrivelse
get( string $key ) mixed Hent en værdi. Returnerer null, hvis værdien ikke findes eller er udløbet.
set( string $key, mixed $value, int $ttl = 0 ) void Gem en værdi. TTL på 0 betyder, at værdien ikke udløber.
delete( string $key ) void Fjern en værdi.
has( string $key ) bool Kontrollér, om en nøgle findes og ikke er udløbet.
add( string $key, mixed $value, int $ttl = 0 ) bool Angiv kun en værdi, hvis nøglen ikke allerede findes (atomisk). Returnerer true, hvis værdien blev angivet.
flush() void Fjern alle elementer fra cachen. ApcuCache::flush() kalder apcu_clear_cache(), som rydder alle APCu-poster på serveren, ikke kun Queuety's.

Indbyggede backends

MemoryCache (standard)

Queuety\Cache\MemoryCache er en arraybaseret cache pr. proces. Elementer gemmes i et PHP array og går tabt, når processen afsluttes. Dette er standardbackend, når APCu ikke er tilgængelig.

Den kræver ingen udvidelser, fungerer godt ved installationer med én worker og holder hver workerproces isoleret fra de andre.

ApcuCache

Queuety\Cache\ApcuCache bruger APCu-udvidelsen til delt hukommelse på tværs af alle PHP-processer på samme server. Alle nøgler får automatisk præfikset queuety: for at undgå sammenfald med andre applikationer.

Denne backend kræver udvidelsen php-apcu, deler cacheposter mellem workers på samme server og gør add() ægte atomisk via apcu_add().

Automatisk registrering

Queuety\Cache\CacheFactory vælger automatisk den bedst tilgængelige backend:

Hvis apcu_store() findes, og apcu_enabled() returnerer true, bruger Queuety ApcuCache. Ellers falder den tilbage til MemoryCache. Dette sker i Queuety::init(), så standardadfærden kræver ingen ekstra konfiguration.

Hvad der caches

Cachelaget bruges internt af flere undersystemer:

Data Formål
Køens pausetilstand Undgår en databaseforespørgsel ved hver gentagelse af workerløkken
Tællere for hastighedsbegrænsning Registrerer antal kørsler i hukommelsen i stedet for i databasen
Workflowtilstand Reducerer antallet af læsninger under fremdrift i workflows med flere trin
Låsetilstand Fremskynder kontrol af, om låse findes, for unikke jobs og mutex-middleware

TTL-konfiguration

Standard-TTL for cachen er 5 sekunder. Den gælder køens pausetilstand og tællere for hastighedsbegrænsning; status- og tilstandslæsninger for workflows caches i faste 2 sekunder, som konstanten ikke ændrer. Tilsidesæt standarden med konstanten QUEUETY_CACHE_TTL i din wp-config.php:

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

En lavere TTL betyder hyppigere databaseforespørgsler, men friskere data. En højere TTL reducerer belastningen på databasen, men giver mere forældede data. For de fleste installationer er standarden på 5 sekunder en god balance.

Tilpasset cachebackend

Hvis du vil bruge en tilpasset cachebackend (Redis, Memcached eller en anden), skal du implementere grænsefladen Contracts\Cache og kalde Queuety::set_cache() fø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 );

Hvis set_cache() kaldes før init(), springes fabrikkens automatiske registrering helt over, og din tilpassede backend bruges.

Adgang til cachen

Hent den aktive cacheinstans når som helst:

PHP
$cache = Queuety::cache();

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

Dette returnerer den backend, der aktuelt er aktiv (MemoryCache, ApcuCache eller din tilpassede implementering).