
# Podėliavimas

Queuety turi podėlio talpyklą, kuri mažina duomenų bazės užklausų skaičių dažnai naudojamuose keliuose, pavyzdžiui, tikrinant eilės pristabdymą, greičio ribojimo skaitiklius, darbo eigos būseną ir užraktų veikimą. Talpykla inicijuojama automatiškai iškvietus `Queuety::init()`.

## Podėlio sąsaja

Visos podėlio sąsajos realizacijos įgyvendina `Queuety\Contracts\Cache`:

| Metodas | Grąžinama reikšmė | Aprašymas |
|---|---|---|
| `get( string $key )` | `mixed` | Gauti reikšmę. Grąžina `null`, jei jos nėra arba ji nebegalioja. |
| `set( string $key, mixed $value, int $ttl = 0 )` | `void` | Išsaugoti reikšmę. TTL 0 reiškia, kad ji negalioja pasibaigus terminui. |
| `delete( string $key )` | `void` | Pašalinti reikšmę. |
| `has( string $key )` | `bool` | Patikrinti, ar raktas egzistuoja ir vis dar galioja. |
| `add( string $key, mixed $value, int $ttl = 0 )` | `bool` | Nustatyti reikšmę tik jei raktas dar neegzistuoja (atomiškai). Grąžina `true`, jei reikšmė nustatyta. |
| `flush()` | `void` | Pašalinti visus talpyklos elementus. `ApcuCache::flush()` iškviečia `apcu_clear_cache()`, kuris pašalina visus serverio APCu įrašus, ne tik Queuety. |

## Integruotos posistemės

### MemoryCache (numatytoji)

`Queuety\Cache\MemoryCache` yra masyvu pagrįsta kiekvieno proceso talpykla. Elementai laikomi PHP masyve ir prarandami procesui pasibaigus. Tai numatytoji posistemė, kai APCu nepasiekiama.

Jai nereikia plėtinių, ji puikiai veikia diegiant su vienu darbuotoju, o kiekvieno darbuotojo procesas lieka atskirtas nuo kitų.

### ApcuCache

`Queuety\Cache\ApcuCache` naudoja APCu plėtinį bendrajai atminčiai visuose to paties serverio PHP procesuose. Visiems raktams automatiškai pridedamas priešdėlis `queuety:`, kad jie nesikirstų su kitų programų raktais.

Šiai posistemei reikia plėtinio `php-apcu`, ji bendrina talpyklos įrašus tarp to paties serverio darbuotojų ir užtikrina, kad `add()` būtų tikrai atomiškas naudojant `apcu_add()`.

## Automatinis aptikimas

`Queuety\Cache\CacheFactory` automatiškai parenka geriausią prieinamą posistemę:

Jei `apcu_store()` egzistuoja, o `apcu_enabled()` grąžina `true`, Queuety naudoja `ApcuCache`. Kitu atveju pasirenkama atsarginė `MemoryCache`. Tai vyksta per `Queuety::init()`, todėl numatytajai elgsenai papildomos konfigūracijos nereikia.

## Kas podėliuojama

Talpyklą viduje naudoja kelios posistemės:

| Duomenys | Paskirtis |
|---|---|
| Eilės pristabdymo būsena | Išvengiama duomenų bazės užklausos kiekvieno darbuotojo ciklo metu |
| Greičio ribojimo skaitikliai | Vykdymų skaičius sekamas atmintyje, o ne duomenų bazėje |
| Darbo eigos būsena | Mažiau skaitoma duomenų perkeliant kelių žingsnių darbo eigą į priekį |
| Užrakto būsena | Paspartinamas užraktų egzistavimo tikrinimas unikalioms užduotims ir abipusio blokavimo tarpinei programinei įrangai |

## TTL konfigūracija

Numatytasis talpyklos TTL yra 5 sekundės. Jis taikomas eilės pristabdymo būsenai ir greičio ribojimo skaitikliams; darbo eigos būsenos ir būsenos nuskaitymai talpykloje laikomi fiksuotas 2 sekundes, šios trukmės konstanta nekeičia. Numatytąją reikšmę galite pakeisti `QUEUETY_CACHE_TTL` konstanta savo `wp-config.php`:

```php
define( 'QUEUETY_CACHE_TTL', 10 ); // 10 seconds
```

Trumpesnis TTL reiškia dažnesnes duomenų bazės užklausas, bet naujesnius duomenis. Ilgesnis TTL sumažina duomenų bazės apkrovą, bet padidina pasenusių duomenų tikimybę. Daugumai diegimų numatytoji 5 sekundžių trukmė yra tinkamas kompromisas.

## Pasirinktinė podėlio posistemė

Norėdami naudoti pasirinktinę podėlio posistemę (Redis, Memcached ar kitą), įgyvendinkite sąsają `Contracts\Cache` ir prieš `Queuety::init()` iškvieskite `Queuety::set_cache()`:

```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 );
```

Jei `set_cache()` iškviečiamas prieš `init()`, gamyklos automatinis aptikimas visiškai praleidžiamas ir naudojama jūsų pasirinktinė posistemė.

## Prieiga prie podėlio

Bet kuriuo metu gaukite aktyvios talpyklos egzempliorių:

```php
$cache = Queuety::cache();

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

Grąžinama šiuo metu aktyvi posistemė (MemoryCache, ApcuCache arba jūsų pasirinktinė realizacija).
