
# Kešatmiņa

Queuety ietver kešatmiņas slāni, kas samazina datu bāzes vaicājumu skaitu bieži izmantotās vietās, piemēram, pārbaudot rindas pauzi, ātruma ierobežojumu skaitītājus, darbplūsmas stāvokļa meklējumus un slēdzeņu darbības. Kešatmiņa tiek inicializēta automātiski, kad izsaucat `Queuety::init()`.

## Kešatmiņas saskarne

Visas kešatmiņas aizmugursistēmas implementē `Queuety\Contracts\Cache`:

| Metode | Atgriež | Apraksts |
|---|---|---|
| `get( string $key )` | `mixed` | Iegūst vērtību. Atgriež `null`, ja tā nav atrasta vai ir beidzies tās derīguma termiņš. |
| `set( string $key, mixed $value, int $ttl = 0 )` | `void` | Saglabā vērtību. TTL 0 nozīmē, ka derīguma termiņš nebeidzas. |
| `delete( string $key )` | `void` | Noņem vērtību. |
| `has( string $key )` | `bool` | Pārbauda, vai atslēga pastāv un tās derīguma termiņš nav beidzies. |
| `add( string $key, mixed $value, int $ttl = 0 )` | `bool` | Iestata vērtību tikai tad, ja atslēga vēl nepastāv (atomiski). Atgriež `true`, ja vērtība ir iestatīta. |
| `flush()` | `void` | Noņem visus kešatmiņas vienumus. `ApcuCache::flush()` izsauc `apcu_clear_cache()`, kas serverī iztīra visus APCu ierakstus, nevis tikai Queuety. |

## Iebūvētās aizmugursistēmas

### MemoryCache (noklusējuma)

`Queuety\Cache\MemoryCache` ir uz masīviem balstīta kešatmiņa katram procesam. Vienumi tiek glabāti PHP masīvā un tiek zaudēti, kad process tiek apturēts. Šī ir noklusējuma aizmugursistēma, ja APCu nav pieejams.

Tai nav nepieciešami paplašinājumi, tā labi darbojas izvietojumos ar vienu darba procesu un nodrošina katra darba procesa izolāciju no pārējiem.

### ApcuCache

`Queuety\Cache\ApcuCache` izmanto APCu paplašinājumu, lai nodrošinātu koplietojamo atmiņu visiem PHP procesiem vienā serverī. Visām atslēgām automātiski tiek pievienots prefikss `queuety:`, lai novērstu sadursmes ar citām lietotnēm.

Šai aizmugursistēmai nepieciešams paplašinājums `php-apcu`, tā koplieto kešatmiņas ierakstus starp darba procesiem vienā serverī un nodrošina patiesi atomisku `add()` darbību, izmantojot `apcu_add()`.

## Automātiskā noteikšana

`Queuety\Cache\CacheFactory` automātiski izvēlas labāko pieejamo aizmugursistēmu:

Ja `apcu_store()` pastāv un `apcu_enabled()` atgriež `true`, Queuety izmanto `ApcuCache`. Pretējā gadījumā tas izmanto `MemoryCache`. Tas notiek iekšēji `Queuety::init()`, tāpēc noklusējuma darbībai nav nepieciešama papildu konfigurācija.

## Kas tiek kešots

Kešatmiņas slāni iekšēji izmanto vairākas apakšsistēmas:

| Dati | Mērķis |
|---|---|
| Rindas pauzes stāvoklis | Novērš datu bāzes vaicājumu katrā darba procesa cilpas iterācijā |
| Ātruma ierobežojumu skaitītāji | Uzskaita izpildes reizes atmiņā, nevis datu bāzē |
| Darbplūsmas stāvoklis | Samazina nolasījumu skaitu, virzot vairāku soļu darbplūsmu uz priekšu |
| Slēdzenes stāvoklis | Paātrina unikālu uzdevumu un savstarpējās izslēgšanas starpprogrammatūras slēdzeņu esamības pārbaudes |

## TTL konfigurācija

Kešatmiņas noklusējuma TTL ir 5 sekundes. Tas attiecas uz rindas pauzes stāvokli un ātruma ierobežojumu skaitītājiem; darbplūsmas statusa un stāvokļa nolasījumi tiek kešoti fiksētas 2 sekundes, ko šī konstante nemaina. Mainiet noklusējuma vērtību ar konstanti `QUEUETY_CACHE_TTL` savā `wp-config.php`:

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

Īsāks TTL nozīmē biežākus datu bāzes vaicājumus, bet svaigākus datus. Garāks TTL samazina datu bāzes slodzi, bet palielina novecojušu datu iespējamību. Lielākajai daļai izvietojumu noklusējuma 5 sekundes ir labs līdzsvars.

## Pielāgota kešatmiņas aizmugursistēma

Lai izmantotu pielāgotu kešatmiņas aizmugursistēmu (Redis, Memcached vai jebkuru citu), implementējiet saskarni `Contracts\Cache` un izsauciet `Queuety::set_cache()` pirms `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 );
```

Ja `set_cache()` tiek izsaukts pirms `init()`, rūpnīcas automātiskā noteikšana tiek pilnībā izlaista un tiek izmantota jūsu pielāgotā aizmugursistēma.

## Piekļuve kešatmiņai

Jebkurā laikā iegūstiet aktīvo kešatmiņas instanci:

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

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

Tiek atgriezta pašlaik aktīvā aizmugursistēma (MemoryCache, ApcuCache vai jūsu pielāgotā implementācija).
