
# Vahemällu salvestamine

Queuety sisaldab vahemälukihti, mis vähendab andmebaasipäringuid sageli kasutatavates kohtades, nagu järjekorra peatamise kontrollid, kiiruspiirangu loendurid, töövoo oleku otsingud ja lukutoimingud. Vahemälu lähtestatakse automaatselt, kui kutsud välja `Queuety::init()`.

## Vahemälu liides

Kõik vahemälu taustsüsteemid rakendavad liidest `Queuety\Contracts\Cache`:

| Meetod | Tagastab | Kirjeldus |
|---|---|---|
| `get( string $key )` | `mixed` | Too väärtus. Tagastab `null`, kui väärtust ei leita või see on aegunud. |
| `set( string $key, mixed $value, int $ttl = 0 )` | `void` | Salvesta väärtus. TTL 0 tähendab, et aegumine puudub. |
| `delete( string $key )` | `void` | Eemalda väärtus. |
| `has( string $key )` | `bool` | Kontrolli, kas võti on olemas ega ole aegunud. |
| `add( string $key, mixed $value, int $ttl = 0 )` | `bool` | Määra väärtus ainult siis, kui võtit veel pole (aatomiline). Tagastab `true`, kui väärtus määrati. |
| `flush()` | `void` | Eemalda vahemälust kõik üksused. `ApcuCache::flush()` kutsub välja `apcu_clear_cache()`, mis tühjendab kõik serveri APCu kirjed, mitte ainult Queuety omad. |

## Sisseehitatud taustsüsteemid

### MemoryCache (vaikimisi)

`Queuety\Cache\MemoryCache` on massiivipõhine protsessipõhine vahemälu. Üksused salvestatakse massiivi PHP ja lähevad protsessi lõppedes kaotsi. See on vaike-taustsüsteem, kui APCu pole saadaval.

See ei vaja laiendusi, sobib hästi ühe töötajaga juurutustele ja hoiab iga töötaja protsessi teistest eraldatuna.

### ApcuCache

`Queuety\Cache\ApcuCache` kasutab laiendust APCu, et jagada mälu kõigi sama serveri PHP protsesside vahel. Kõigile võtmetele lisatakse automaatselt prefiks `queuety:`, et vältida kokkupõrkeid teiste rakendustega.

See taustsüsteem nõuab laiendust `php-apcu`, jagab vahemälukirjeid sama serveri töötajate vahel ja muudab `add()` toimingu `apcu_add()` abil tõeliselt aatomiliseks.

## Automaatne tuvastamine

`Queuety\Cache\CacheFactory` valib automaatselt parima saadaoleva taustsüsteemi:

Kui `apcu_store()` on olemas ja `apcu_enabled()` tagastab `true`, kasutab Queuety väärtust `ApcuCache`. Vastasel juhul kasutatakse tagavarana `MemoryCache`. See toimub funktsiooni `Queuety::init()` sees, mistõttu pole vaikekäitumiseks lisaseadistusi vaja.

## Mida vahemällu salvestatakse

Vahemälukihti kasutavad sisemiselt mitu alamsüsteemi:

| Andmed | Eesmärk |
|---|---|
| Järjekorra peatamise olek | Väldib andmebaasipäringut igal töötaja tsükli iteratsioonil |
| Kiiruspiirangu loendurid | Jälgivad käivituste arvu mälus, mitte andmebaasis |
| Töövoo olek | Vähendab lugemisi mitmeastmelise töövoo edenemisel |
| Luku olek | Kiirendab unikaalsete tööde ja mutex-vahevara luku olemasolu kontrollimist |

## TTL-i seadistamine

Vaikimisi on vahemälu TTL 5 sekundit. See kehtib järjekorra peatamise oleku ja kiiruspiirangu loendurite kohta; töövoo oleku ja oleku lugemisi hoitakse vahemälus kindla 2 sekundi vältel ning konstant seda ei muuda. Muuda vaikeväärtust konstandiga `QUEUETY_CACHE_TTL` failis `wp-config.php`:

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

Lühem TTL tähendab sagedasemaid andmebaasipäringuid, kuid värskemaid andmeid. Pikem TTL vähendab andmebaasi koormust, kuid muudab andmed aegunumaks. Enamiku juurutuste jaoks on vaikeväärtus 5 sekundit hea tasakaal.

## Kohandatud vahemälu taustsüsteem

Kohandatud vahemälu taustsüsteemi kasutamiseks (Redis, Memcached või mõni muu) rakenda liidest `Contracts\Cache` ja kutsu välja `Queuety::set_cache()` enne `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 );
```

Kui `set_cache()` kutsutakse välja enne `init()`, jäetakse tehase automaattuvastus täielikult vahele ja kasutatakse sinu kohandatud taustsüsteemi.

## Vahemälule juurdepääs

Too aktiivne vahemälu eksemplar igal ajal:

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

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

See tagastab parajasti aktiivse taustsüsteemi (MemoryCache, ApcuCache või sinu kohandatud teostuse).
