
# 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).
