Към съдържанието

Кеширане

Queuety включва кеш слой, който намалява заявките към базата данни при често използвани операции, като проверки за пауза на опашката, броячи за ограничаване на честотата, справки за състоянието на работния процес и операции със заключвания. Кешът се инициализира автоматично при извикване на Queuety::init().

Интерфейс на кеша

Всички кеш бекендове реализират Queuety\Contracts\Cache:

Метод Връща Описание
get( string $key ) mixed Извлича стойност. Връща null, ако стойността не е намерена или е изтекла.
set( string $key, mixed $value, int $ttl = 0 ) void Съхранява стойност. TTL от 0 означава, че няма срок на валидност.
delete( string $key ) void Премахва стойност.
has( string $key ) bool Проверява дали ключ съществува и не е изтекъл.
add( string $key, mixed $value, int $ttl = 0 ) bool Задава стойност само ако ключът още не съществува (атомарно). Връща true, ако стойността е зададена.
flush() void Премахва всички елементи от кеша. ApcuCache::flush() извиква apcu_clear_cache(), което изчиства всеки APCu запис на сървъра, а не само тези на Queuety.

Вградени бекендове

MemoryCache (по подразбиране)

Queuety\Cache\MemoryCache е кеш, базиран на масив и отделен за всеки процес. Елементите се съхраняват в масив PHP и се губят при приключване на процеса. Това е бекендът по подразбиране, когато APCu не е наличен.

Не изисква разширения, работи добре при внедрявания с един работен процес и изолира всеки работен процес от останалите.

ApcuCache

Queuety\Cache\ApcuCache използва разширението APCu за споделена памет между всички процеси PHP на един и същ сървър. Към всички ключове автоматично се добавя префикс queuety:, за да се избегнат конфликти с други приложения.

Този бекенд изисква разширението php-apcu, споделя кеш записите между работните процеси на един и същ сървър и прави add() действително атомарно чрез apcu_add().

Автоматично откриване

Queuety\Cache\CacheFactory автоматично избира най-подходящия наличен бекенд:

Ако apcu_store() съществува и apcu_enabled() връща true, Queuety използва ApcuCache. В противен случай преминава към MemoryCache. Това се случва в Queuety::init(), така че поведението по подразбиране не изисква допълнителна конфигурация.

Какво се кешира

Кеш слоят се използва вътрешно от няколко подсистеми:

Данни Предназначение
Състояние на паузата на опашката Избягва заявка към базата данни при всяка итерация на цикъла на работния процес
Броячи за ограничаване на честотата Проследява броя изпълнения в паметта вместо в базата данни
Състояние на работния процес Намалява броя на четенията при преминаване през многоетапен работен процес
Състояние на заключванията Ускорява проверките за съществуване на заключвания за уникални задачи и междинен софтуер за взаимно изключване

Конфигурация на TTL

TTL на кеша по подразбиране е 5 секунди. Той се прилага към състоянието на паузата на опашката и броячите за ограничаване на честотата; прочитанията на състоянието и статуса на работния процес се кешират за фиксирани 2 секунди, които константата не променя. Заменете стойността по подразбиране с константата QUEUETY_CACHE_TTL във вашия wp-config.php:

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

По-нисък TTL означава по-чести заявки към базата данни, но и по-актуални данни. По-висок TTL намалява натоварването на базата данни, но води до по-остарели данни. За повечето внедрявания стойността по подразбиране от 5 секунди е добър баланс.

Персонализиран кеш бекенд

За да използвате персонализиран кеш бекенд (Redis, Memcached или друг), реализирайте интерфейса Contracts\Cache и извикайте Queuety::set_cache() преди 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 );

Ако set_cache() бъде извикано преди init(), автоматичното откриване във фабриката се пропуска изцяло и се използва вашият персонализиран бекенд.

Достъп до кеша

Извлечете активната кеш инстанция по всяко време:

PHP
$cache = Queuety::cache();

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

Това връща текущо активния бекенд (MemoryCache, ApcuCache или ваша персонализирана реализация).