
# Välimuisti

Queuety sisältää välimuistikerroksen, joka vähentää tietokantakyselyjä usein käytetyissä toiminnoissa, kuten jonon taukotilan tarkistuksissa, nopeusrajoituslaskureissa, työnkulun tilahauissa ja lukitustoiminnoissa. Välimuisti alustetaan automaattisesti, kun kutsut `Queuety::init()`.

## Välimuistirajapinta

Kaikki välimuistin taustajärjestelmät toteuttavat rajapinnan `Queuety\Contracts\Cache`:

| Metodi | Palauttaa | Kuvaus |
|---|---|---|
| `get( string $key )` | `mixed` | Hakee arvon. Palauttaa `null`, jos arvoa ei löydy tai se on vanhentunut. |
| `set( string $key, mixed $value, int $ttl = 0 )` | `void` | Tallentaa arvon. TTL 0 tarkoittaa, ettei arvo vanhene. |
| `delete( string $key )` | `void` | Poistaa arvon. |
| `has( string $key )` | `bool` | Tarkistaa, onko avain olemassa ja voimassa. |
| `add( string $key, mixed $value, int $ttl = 0 )` | `bool` | Asettaa arvon vain, jos avainta ei vielä ole olemassa (atomisesti). Palauttaa `true`, jos arvo asetettiin. |
| `flush()` | `void` | Poistaa kaikki välimuistin kohteet. `ApcuCache::flush()` kutsuu `apcu_clear_cache()`, joka tyhjentää palvelimen kaikki APCu-merkinnät, ei vain Queuetyn merkintöjä. |

## Sisäänrakennetut taustajärjestelmät

### MemoryCache (oletus)

`Queuety\Cache\MemoryCache` on taulukkopohjainen, prosessikohtainen välimuisti. Kohteet tallennetaan PHP-taulukkoon, ja ne katoavat prosessin päättyessä. Tämä on oletustaustajärjestelmä, kun APCu ei ole käytettävissä.

Se ei vaadi laajennuksia, toimii hyvin yhden työntekijän käyttöönotossa ja pitää kunkin työntekijäprosessin erillään muista.

### ApcuCache

`Queuety\Cache\ApcuCache` käyttää APCu-laajennusta jaettua muistia varten kaikissa saman palvelimen PHP-prosesseissa. Kaikkien avainten etuliitteeksi lisätään automaattisesti `queuety:` törmäysten välttämiseksi muiden sovellusten kanssa.

Tämä taustajärjestelmä vaatii `php-apcu`-laajennuksen, jakaa välimuistimerkinnät saman palvelimen työntekijöiden kesken ja tekee `add()`stä aidosti atomisen toiminnolla `apcu_add()`.

## Automaattinen tunnistus

`Queuety\Cache\CacheFactory` valitsee automaattisesti parhaan käytettävissä olevan taustajärjestelmän:

Jos `apcu_store()` on olemassa ja `apcu_enabled()` palauttaa arvon `true`, Queuety käyttää toimintoa `ApcuCache`. Muussa tapauksessa se käyttää varavaihtoehtona `MemoryCache`. Tämä tapahtuu `Queuety::init()`n sisällä, joten oletustoiminta ei vaadi lisämäärityksiä.

## Välimuistiin tallennettavat tiedot

Useat alijärjestelmät käyttävät välimuistikerrosta sisäisesti:

| Tieto | Tarkoitus |
|---|---|
| Jonon taukotila | Välttää tietokantakyselyn jokaisella työntekijän silmukkakierroksella |
| Nopeusrajoituslaskurit | Seuraa suorituskertoja muistissa tietokannan sijaan |
| Työnkulun tila | Vähentää lukuja monivaiheisen työnkulun etenemisen aikana |
| Lukituksen tila | Nopeuttaa yksilöllisten töiden ja mutex-väliohjelmiston lukitustarkistuksia |

## TTL-määritys

Välimuistin oletusarvoinen TTL on 5 sekuntia. Se koskee jonon taukotilaa ja nopeusrajoituslaskureita; työnkulun tilan ja tilatietojen lukuja välimuistitetaan kiinteäksi 2 sekunniksi, eikä vakio muuta tätä. Korvaa oletusarvo `QUEUETY_CACHE_TTL`-vakiolla tiedostossa `wp-config.php`:

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

Lyhyempi TTL tarkoittaa useampia tietokantakyselyjä, mutta ajantasaisempia tietoja. Pidempi TTL vähentää tietokannan kuormitusta, mutta tiedot voivat vanhentua enemmän. Useimmissa käyttöönotossa oletusarvoinen 5 sekuntia on hyvä tasapaino.

## Mukautettu välimuistin taustajärjestelmä

Jos haluat käyttää mukautettua välimuistin taustajärjestelmää (Redis, Memcached tai muuta), toteuta rajapinta `Contracts\Cache` ja kutsu `Queuety::set_cache()` ennen toimintoa `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 );
```

Jos `set_cache()` kutsutaan ennen `init()`, tehtaan automaattinen tunnistus ohitetaan kokonaan ja mukautettua taustajärjestelmää käytetään.

## Välimuistin käyttäminen

Hae aktiivinen välimuisti-instanssi milloin tahansa:

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

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

Tämä palauttaa sillä hetkellä aktiivisen taustajärjestelmän (MemoryCache, ApcuCache tai oman toteutuksesi).
