Preskoči na vsebino

Predpomnjenje

Queuety vključuje predpomnilniško plast, ki zmanjšuje število poizvedb v zbirko podatkov na najbolj obremenjenih poteh, kot so preverjanja zaustavitve čakalne vrste, števci omejitev hitrosti, iskanja stanja poteka dela in operacije zaklepanja. Predpomnilnik se inicializira samodejno, ko pokličete Queuety::init().

Vmesnik predpomnilnika

Vsa zaledja predpomnilnika implementirajo Queuety\Contracts\Cache:

Metoda Vrne Opis
get( string $key ) mixed Pridobi vrednost. Če je ni mogoče najti ali je potekla, vrne null.
set( string $key, mixed $value, int $ttl = 0 ) void Shrani vrednost. TTL 0 pomeni, da ne poteče.
delete( string $key ) void Odstrani vrednost.
has( string $key ) bool Preveri, ali ključ obstaja in še ni potekel.
add( string $key, mixed $value, int $ttl = 0 ) bool Nastavi vrednost samo, če ključ še ne obstaja (atomsko). Če je bila vrednost nastavljena, vrne true.
flush() void Iz predpomnilnika odstrani vse elemente. ApcuCache::flush() pokliče apcu_clear_cache(), ki izbriše vsak vnos APCu v strežniku, ne le vnosov aplikacije Queuety.

Vgrajena zaledja

MemoryCache (privzeto)

Queuety\Cache\MemoryCache je predpomnilnik na podlagi polja za posamezen proces. Elementi so shranjeni v polju PHP in se izgubijo, ko se proces konča. To je privzeto zaledje, kadar APCu ni na voljo.

Ne zahteva razširitev, dobro deluje pri uvedbah z enim delavcem in ohranja proces vsakega delavca ločen od drugih.

ApcuCache

Queuety\Cache\ApcuCache uporablja razširitev APCu za skupni pomnilnik med vsemi procesi PHP v istem strežniku. Pred vsemi ključi se samodejno doda predpona queuety:, da se preprečijo trki z drugimi aplikacijami.

To zaledje zahteva razširitev php-apcu, omogoča skupno rabo vnosov predpomnilnika med delavci v istem strežniku in zagotavlja, da je add() zares atomski prek apcu_add().

Samodejno zaznavanje

Queuety\Cache\CacheFactory samodejno izbere najboljše razpoložljivo zaledje:

Če apcu_store() obstaja in apcu_enabled() vrne true, Queuety uporabi ApcuCache. V nasprotnem primeru uporabi MemoryCache. To se zgodi znotraj Queuety::init(), zato privzeto vedenje ne zahteva dodatnih nastavitev.

Kaj se predpomni

Predpomnilniško plast interno uporablja več podsistemov:

Podatek Namen
Stanje zaustavitve čakalne vrste Preprečuje poizvedbo v zbirko podatkov pri vsakem koraku zanke delavca
Števci omejitev hitrosti Število izvedb spremlja v pomnilniku namesto v zbirki podatkov
Stanje poteka dela Zmanjšuje število branj med napredovanjem večstopenjskega poteka dela
Stanje zaklepanja Pospešuje preverjanje obstoja zaklepanja za enolična opravila in vmesno programsko opremo za medsebojno izključevanje

Nastavitev TTL

Privzeti TTL predpomnilnika je 5 sekund. Velja za stanje zaustavitve čakalne vrste in števce omejitev hitrosti; branja stanja in stanja poteka dela se predpomnijo za stalni 2 sekundi, na kateri ta konstanta ne vpliva. Privzeto vrednost spremenite s konstanto QUEUETY_CACHE_TTL v svoji datoteki wp-config.php:

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

Krajši TTL pomeni pogostejše poizvedbe v zbirko podatkov, a sveže podatke. Daljši TTL zmanjša obremenitev zbirke podatkov, vendar so podatki lahko bolj zastareli. Za večino uvedb je privzeta vrednost 5 sekund dobro ravnovesje.

Zaledje predpomnilnika po meri

Če želite uporabiti zaledje predpomnilnika po meri (Redis, Memcached ali katero koli drugo), implementirajte vmesnik Contracts\Cache in pokličite 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 );

Če pokličete set_cache() pred init(), se samodejno zaznavanje v tovarni v celoti preskoči in uporabi se vaše zaledje po meri.

Dostop do predpomnilnika

Kadar koli pridobite aktivni primerek predpomnilnika:

PHP
$cache = Queuety::cache();

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

To vrne trenutno aktivno zaledje (MemoryCache, ApcuCache ali vašo implementacijo po meri).