
# Ukladanie do vyrovnávacej pamäte

Queuety obsahuje vrstvu vyrovnávacej pamäte, ktorá obmedzuje databázové dotazy na často používaných cestách, ako sú kontroly pozastavenia frontu, počítadlá obmedzenia frekvencie, vyhľadávanie stavu pracovného postupu a operácie so zámkami. Vyrovnávacia pamäť sa inicializuje automaticky pri zavolaní `Queuety::init()`.

## Rozhranie vyrovnávacej pamäte

Všetky back-endy vyrovnávacej pamäte implementujú rozhranie `Queuety\Contracts\Cache`:

| Metóda | Návratová hodnota | Opis |
|---|---|---|
| `get( string $key )` | `mixed` | Načíta hodnotu. Ak sa nenájde alebo jej platnosť vypršala, vráti `null`. |
| `set( string $key, mixed $value, int $ttl = 0 )` | `void` | Uloží hodnotu. TTL 0 znamená, že platnosť nevyprší. |
| `delete( string $key )` | `void` | Odstráni hodnotu. |
| `has( string $key )` | `bool` | Skontroluje, či kľúč existuje a nevypršala jeho platnosť. |
| `add( string $key, mixed $value, int $ttl = 0 )` | `bool` | Nastaví hodnotu iba vtedy, ak kľúč ešte neexistuje (atomicky). Ak sa hodnota nastavila, vráti `true`. |
| `flush()` | `void` | Odstráni všetky položky z vyrovnávacej pamäte. `ApcuCache::flush()` volá `apcu_clear_cache()`, ktoré vymaže všetky položky APCu na serveri, nielen položky aplikácie Queuety. |

## Vstavané back-endy

### MemoryCache (predvolená možnosť)

`Queuety\Cache\MemoryCache` je vyrovnávacia pamäť založená na poli, ktorá je oddelená pre každý proces. Položky sa ukladajú do poľa PHP a po ukončení procesu sa stratia. Ide o predvolený back-end, ak APCu nie je k dispozícii.

Nevyžaduje žiadne rozšírenia, dobre funguje pri nasadení s jedným workerom a každý proces workera zostáva oddelený od ostatných.

### ApcuCache

`Queuety\Cache\ApcuCache` používa rozšírenie APCu na zdieľanie pamäte medzi všetkými procesmi PHP na tom istom serveri. Všetky kľúče automaticky dostanú predponu `queuety:`, aby sa predišlo kolíziám s inými aplikáciami.

Tento back-end vyžaduje rozšírenie `php-apcu`, zdieľa položky vyrovnávacej pamäte medzi workermi na tom istom serveri a vďaka `apcu_add()` zabezpečuje skutočne atomické `add()`.

## Automatické rozpoznanie

`Queuety\Cache\CacheFactory` automaticky vyberie najvhodnejší dostupný back-end:

Ak `apcu_store()` existuje a `apcu_enabled()` vracia `true`, Queuety použije `ApcuCache`. V opačnom prípade prejde na `MemoryCache`. Deje sa to v rámci `Queuety::init()`, takže predvolené správanie nevyžaduje ďalšiu konfiguráciu.

## Čo sa ukladá do vyrovnávacej pamäte

Vrstva vyrovnávacej pamäte sa interne používa v niekoľkých subsystémoch:

| Údaje | Účel |
|---|---|
| Stav pozastavenia frontu | Zabraňuje databázovému dotazu pri každej iterácii cyklu workera |
| Počítadlá obmedzenia frekvencie | Sledujú počty vykonaní v pamäti namiesto databázy |
| Stav pracovného postupu | Obmedzuje čítania počas postupu viacstupňového pracovného postupu |
| Stav zámku | Urýchľuje kontroly existencie zámkov pri jedinečných úlohách a middleware pre mutexy |

## Konfigurácia TTL

Predvolená hodnota TTL vyrovnávacej pamäte je 5 sekúnd. Platí pre stav pozastavenia frontu a počítadlá obmedzenia frekvencie; čítania stavu a stavových údajov pracovného postupu sa ukladajú na pevné 2 sekundy, ktoré táto konštanta nemení. Predvolenú hodnotu môžete zmeniť pomocou konštanty `QUEUETY_CACHE_TTL` vo svojom `wp-config.php`:

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

Nižšia hodnota TTL znamená častejšie databázové dotazy, ale aktuálnejšie údaje. Vyššia hodnota TTL znižuje zaťaženie databázy, ale údaje môžu byť zastaranejšie. Pri väčšine nasadení predstavuje predvolená hodnota 5 sekúnd dobrý kompromis.

## Vlastný back-end vyrovnávacej pamäte

Ak chcete použiť vlastný back-end vyrovnávacej pamäte (Redis, Memcached alebo iný), implementujte rozhranie `Contracts\Cache` a zavolajte `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 );
```

Ak zavoláte `set_cache()` pred `init()`, automatické rozpoznanie vo factory sa úplne preskočí a použije sa váš vlastný back-end.

## Prístup k vyrovnávacej pamäti

Kedykoľvek načítajte aktívnu inštanciu vyrovnávacej pamäte:

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

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

Vráti aktuálne aktívny back-end (MemoryCache, ApcuCache alebo vašu vlastnú implementáciu).
